Fix latent bug in ada-lang.c:remove_extra_symbols

I believe ada-lang.c:remove_extra_symbols has a latent bug.  This
function loops over a vector of symbols, removing duplicates according
to some criteria.

At the end of the loop it does:

      if (remove_p)
	syms->erase (syms->begin () + i);
      i += 1;

However, this seems wrong to me -- when removing the i'th element,
this code still increments "i", thus skipping an element.

At first I thought this was a regression from the patches to remove
cleanups from ada-lang.c (this was when std::vector was introduced);
but I found that instead the bug seems to be older:

       if (remove_p)
         {
           for (j = i + 1; j < nsyms; j += 1)
             syms[j - 1] = syms[j];
           nsyms -= 1;
         }

       i += 1;

No test, as I don't know how to write one.

As this is Ada-specific, and was already reviewed internally by Joel,
I am checking it in.

gdb/ChangeLog
2020-09-09  Tom Tromey  <tromey@adacore.com>

	* ada-lang.c (remove_extra_symbols): Do not increment when
	removing an element
This commit is contained in:
Tom Tromey 2020-06-16 11:28:23 -06:00
parent 10556cdc8e
commit 1b788fb6e9
2 changed files with 7 additions and 2 deletions

View file

@ -5047,8 +5047,8 @@ remove_extra_symbols (std::vector<struct block_symbol> *syms)
if (remove_p)
syms->erase (syms->begin () + i);
i += 1;
else
i += 1;
}
/* If all the remaining symbols are identical enumerals, then