Fix latent bug in ada-lang.c:remove_extra_symbols
authorTom Tromey <tromey@adacore.com>
Tue, 16 Jun 2020 17:28:23 +0000 (11:28 -0600)
committerTom Tromey <tromey@adacore.com>
Wed, 9 Sep 2020 18:48:27 +0000 (12:48 -0600)
commit1b788fb6e9860c2e3aa0f9bbcedcd5feded1aa6e
tree02f974ac5df380b36cc066ec5754f7dbee2d643d
parent10556cdc8e4340b0dcc2594aec044ba7b6da4aff
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
gdb/ChangeLog
gdb/ada-lang.c