Simplify resolve_subexp by using C++ algorithms

This changes resolve_subexp to use any_of and the erase-remove idiom
to simplify the code somewhat.  This simplifies the next patch a bit.

gdb/ChangeLog
2021-03-02  Tom Tromey  <tromey@adacore.com>

	* ada-lang.c (resolve_subexp): Use any_of and erase-remove idiom.
This commit is contained in:
Tom Tromey
2021-03-02 13:00:45 -07:00
parent bdcccc5639
commit 886d459fbe
2 changed files with 32 additions and 29 deletions

View File

@@ -1,3 +1,7 @@
2021-03-02 Tom Tromey <tromey@adacore.com>
* ada-lang.c (resolve_subexp): Use any_of and erase-remove idiom.
2021-03-02 Tom Tromey <tromey@adacore.com> 2021-03-02 Tom Tromey <tromey@adacore.com>
* ada-lang.c (struct ada_symbol_cache) <cache_space>: Now an * ada-lang.c (struct ada_symbol_cache) <cache_space>: Now an

View File

@@ -3660,41 +3660,40 @@ resolve_subexp (expression_up *expp, int *pos, int deprocedure_p,
ada_lookup_symbol_list (exp->elts[pc + 2].symbol->linkage_name (), ada_lookup_symbol_list (exp->elts[pc + 2].symbol->linkage_name (),
exp->elts[pc + 1].block, VAR_DOMAIN, exp->elts[pc + 1].block, VAR_DOMAIN,
&candidates); &candidates);
/* Paranoia. */
candidates.resize (n_candidates);
if (n_candidates > 1) if (std::any_of (candidates.begin (),
candidates.end (),
[] (block_symbol &sym)
{
switch (SYMBOL_CLASS (sym.symbol))
{
case LOC_REGISTER:
case LOC_ARG:
case LOC_REF_ARG:
case LOC_REGPARM_ADDR:
case LOC_LOCAL:
case LOC_COMPUTED:
return true;
default:
return false;
}
}))
{ {
/* Types tend to get re-introduced locally, so if there /* Types tend to get re-introduced locally, so if there
are any local symbols that are not types, first filter are any local symbols that are not types, first filter
out all types. */ out all types. */
int j; candidates.erase
for (j = 0; j < n_candidates; j += 1) (std::remove_if
switch (SYMBOL_CLASS (candidates[j].symbol)) (candidates.begin (),
candidates.end (),
[] (block_symbol &sym)
{ {
case LOC_REGISTER: return SYMBOL_CLASS (sym.symbol) == LOC_TYPEDEF;
case LOC_ARG: }),
case LOC_REF_ARG: candidates.end ());
case LOC_REGPARM_ADDR: n_candidates = candidates.size ();
case LOC_LOCAL:
case LOC_COMPUTED:
goto FoundNonType;
default:
break;
}
FoundNonType:
if (j < n_candidates)
{
j = 0;
while (j < n_candidates)
{
if (SYMBOL_CLASS (candidates[j].symbol) == LOC_TYPEDEF)
{
candidates[j] = candidates[n_candidates - 1];
n_candidates -= 1;
}
else
j += 1;
}
}
} }
if (n_candidates == 0) if (n_candidates == 0)