wrong value returned by ada-lang.c:compare_names
authorJoel Brobecker <brobecker@gnat.com>
Tue, 29 Nov 2011 01:00:52 +0000 (01:00 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Tue, 29 Nov 2011 01:00:52 +0000 (01:00 +0000)
commit1a1d55138808328dcba03007dad0dd027b4199ad
tree02e75d9056bcfcea9c5267465053e42b7ee095df
parent8ee00506e14ddaf15f1e374cb5ab9d3c86fab971
wrong value returned by ada-lang.c:compare_names

The ada-lang.c:compare_names function returns the wrong value
when the first string starts with the same contents as the second
string, followed by '_' and then some characters that do not make
a symbol name suffix.  For instance:

    string1 = "generics__test_generics__instance__print"
    string2 = "generics__test_generics"

In that case, compare_names (string1, string2) return -1, when
clearly, string1 is greater than string2.

A consequence of this problem is that GDB may fail to lookup
"generics.test_generics" from our partial symtabs, because
partial symbols are ordered by strcmp_iw_ordered:

    (gdb) b generics.test_generics
    Function "generics.test_generics" not defined.
    Make breakpoint pending on future shared library load? (y or [n])

gdb/ChangeLog:

        * ada-lang.c (compare_names): Fix wrong return value in case
        string1 starts with the same contents as string2, followed
        by an underscore that do not start a symbol name suffix.

gdb/testsuite/ChangeLog:

        * gdb.ada/fullname_bp: New testcase.
gdb/ChangeLog
gdb/ada-lang.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/fullname_bp.exp [new file with mode: 0644]
gdb/testsuite/gdb.ada/fullname_bp/dn.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/fullname_bp/dn.ads [new file with mode: 0644]
gdb/testsuite/gdb.ada/fullname_bp/foo.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/fullname_bp/pck.adb [new file with mode: 0644]
gdb/testsuite/gdb.ada/fullname_bp/pck.ads [new file with mode: 0644]