From 959d6a673ea5f5d3f057165318cee8cea07fd5fc Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 7 Jan 2021 07:02:46 -0700 Subject: [PATCH] Fix regression in Ada do_full_match An earlier patch to ada-lang.c:do_full_match introduced a subtle change to the semantics. The previous code did: - if (strncmp (sym_name, search_name, search_name_len) == 0 - && is_name_suffix (sym_name + search_name_len)) - return true; - - if (startswith (sym_name, "_ada_") whereas the new code unconditionally skips a leading "_ada_". The difference occurs if the lookup name itself starts with "_ada_". In this case, the symbol won't match. Normally this doesn't seem to be a problem. However, it caused a regression on one particular (internal) test case on one particular platform. This patch changes the code to handle this case. I don't know how to write a reliable test case for this, so no test is included. 2021-01-07 Tom Tromey * ada-lang.c (do_full_match): Conditionally skip "_ada_" prefix. --- gdb/ChangeLog | 4 ++++ gdb/ada-lang.c | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dd8c01b710a..f3357d5e659 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2021-01-07 Tom Tromey + + * ada-lang.c (do_full_match): Conditionally skip "_ada_" prefix. + 2021-01-07 Tom Tromey * ada-lang.c (add_component_interval): Start loop using vector's diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 4751b6eeda3..c898ccb683c 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -13572,10 +13572,16 @@ do_full_match (const char *symbol_search_name, const lookup_name_info &lookup_name, completion_match_result *comp_match_res) { - if (startswith (symbol_search_name, "_ada_")) + const char *lname = lookup_name.ada ().lookup_name ().c_str (); + + /* If both symbols start with "_ada_", just let the loop below + handle the comparison. However, if only the symbol name starts + with "_ada_", skip the prefix and let the match proceed as + usual. */ + if (startswith (symbol_search_name, "_ada_") + && !startswith (lname, "_ada")) symbol_search_name += 5; - const char *lname = lookup_name.ada ().lookup_name ().c_str (); int uscore_count = 0; while (*lname != '\0') { -- 2.30.2