Fix gdb.ada/complete.exp's "complete break ada" test (PR gdb/22670)
authorPedro Alves <palves@redhat.com>
Wed, 10 Jan 2018 20:38:07 +0000 (20:38 +0000)
committerPedro Alves <palves@redhat.com>
Wed, 10 Jan 2018 20:46:09 +0000 (20:46 +0000)
This patch fixes the regression covered by the test added by:

    commit 344420da6beac1e0b2f7964e7101f8dcdb509b0d
    Date: Thu Jan 4 03:30:37 2018 -0500
    Subject: Add "complete break ada" test to gdb.ada/complete.exp

The regression had been introduced by:

    commit b5ec771e60c1a0863e51eb491c85c674097e9e13
    Date:   Wed Nov 8 14:22:32 2017 +0000
    Subject: Introduce lookup_name_info and generalize Ada's FULL/WILD name matching

The gist of it is that linespec completion in Ada mode is generating
additional matches that should not appear in the match list
(internally generated symbols, or symbols that should be enclosed
between "<...>").  These extraneous entries have uppercase characters, such as:

    break ada__stringsS
    break ada__strings__R11s
    [etc]

These matches come from minimal symbols.  The problem is that Ada
minsyms end up with no language set (language_auto), and thus we end
up using the generic symbol name matcher for those instead of Ada's.
We already had a special case for in compare_symbol_name to handle
this, but it was limited to expressions, while the case at hand is
completing a linespec.  Fix this by applying the special case to
linespec completion as well.  I.e., remove the EXPRESSION check from
compare_symbol_name.  That alone turns out to not be sufficient still
-- GDB would still show a couple entries that shouldn't be there:

~~
    break ada__exceptions__exception_data__append_info_exception_name__2Xn
    break ada__exceptions__exception_data__exception_name_length__2Xn
~~

The reason is that these minimal symbols end up with their language
set to language_cplus / C++, because those encoded names manage to
demangle successfully as C++ symbols (using an old C++ mangling
scheme):

  $ echo ada__exceptions__exception_data__append_info_exception_name__2Xn | c++filt
  Xn::ada__exceptions__exception_data__append_info_exception_name(void)

It's unfortunate that Ada's encoding scheme doesn't start with some
unique prefix like "_Z" in the C++ Itanium ABI mangling scheme.  For
now, paper over that by treating C++ minsyms as Ada minsyms.

gdb/ChangeLog:
2018-01-10  Pedro Alves  <palves@redhat.com>

        PR gdb/22670
* ada-lang.c (ada_collect_symbol_completion_matches): If the
minsym's language is language_auto or language_cplus, pass down
language_ada instead.
* symtab.c (compare_symbol_name): Don't frob symbol language here.

gdb/testsuite/ChangeLog:
2018-01-10  Pedro Alves  <palves@redhat.com>

        PR gdb/22670
* gdb.ada/complete.exp ("complete break ada"): Replace kfail with
a fail.

gdb/ChangeLog
gdb/ada-lang.c
gdb/symtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/complete.exp

index f8457054987103cef9724cc15174c100c9988d4a..a0df1a38caefee7c72a2ce3c7577828945027a8d 100644 (file)
@@ -1,3 +1,11 @@
+2018-01-10  Pedro Alves  <palves@redhat.com>
+
+       PR gdb/22670
+       * ada-lang.c (ada_collect_symbol_completion_matches): If the
+       minsym's language is language_auto or language_cplus, pass down
+       language_ada instead.
+       * symtab.c (compare_symbol_name): Don't frob symbol language here.
+
 2018-01-10  Pedro Alves  <palves@redhat.com>
 
        PR gdb/22670
index 622cfd0a81ec30ca87ad9c2a9fe0ad2017074879..ab1083830ed4d6ea3dcd95d0874772008357b659 100644 (file)
@@ -6499,8 +6499,25 @@ ada_collect_symbol_completion_matches (completion_tracker &tracker,
     if (completion_skip_symbol (mode, msymbol))
       continue;
 
+    language symbol_language = MSYMBOL_LANGUAGE (msymbol);
+
+    /* Ada minimal symbols won't have their language set to Ada.  If
+       we let completion_list_add_name compare using the
+       default/C-like matcher, then when completing e.g., symbols in a
+       package named "pck", we'd match internal Ada symbols like
+       "pckS", which are invalid in an Ada expression, unless you wrap
+       them in '<' '>' to request a verbatim match.
+
+       Unfortunately, some Ada encoded names successfully demangle as
+       C++ symbols (using an old mangling scheme), such as "name__2Xn"
+       -> "Xn::name(void)" and thus some Ada minimal symbols end up
+       with the wrong language set.  Paper over that issue here.  */
+    if (symbol_language == language_auto
+       || symbol_language == language_cplus)
+      symbol_language = language_ada;
+
     completion_list_add_name (tracker,
-                             MSYMBOL_LANGUAGE (msymbol),
+                             symbol_language,
                              MSYMBOL_LINKAGE_NAME (msymbol),
                              lookup_name, text, word);
   }
index 146dc2e42134e94c2c88f0330983ea19524bfcc0..2fe249682f2bac81140ee394f6b184272a76bdb8 100644 (file)
@@ -4704,21 +4704,7 @@ compare_symbol_name (const char *symbol_name, language symbol_language,
                     const lookup_name_info &lookup_name,
                     completion_match_result &match_res)
 {
-  const language_defn *lang;
-
-  /* If we're completing for an expression and the symbol doesn't have
-     an explicit language set, fallback to the current language.  Ada
-     minimal symbols won't have their language set to Ada, for
-     example, and if we compared using the default/C-like matcher,
-     then when completing e.g., symbols in a package named "pck", we'd
-     match internal Ada symbols like "pckS", which are invalid in an
-     Ada expression, unless you wrap them in '<' '>' to request a
-     verbatim match.  */
-  if (symbol_language == language_auto
-      && lookup_name.match_type () == symbol_name_match_type::EXPRESSION)
-    lang = current_language;
-  else
-    lang = language_def (symbol_language);
+  const language_defn *lang = language_def (symbol_language);
 
   symbol_name_matcher_ftype *name_match
     = language_get_symbol_name_matcher (lang, lookup_name);
index ec763fce92e5268b1a276ef8285e37d6c625ac80..7a2ffb64ae7585d6db2665d266ae12bdd9236b2c 100644 (file)
@@ -1,3 +1,9 @@
+2018-01-10  Pedro Alves  <palves@redhat.com>
+
+       PR gdb/22670
+       * gdb.ada/complete.exp ("complete break ada"): Replace kfail with
+       a fail.
+
 2018-01-10  Pedro Alves  <palves@redhat.com>
 
        PR gdb/22670
index c1f22c2a3e4e9488148cf4ab1b002e289ca29d03..cb9e4ae7ffc652307a603f3488ecd2e9704dc92b 100644 (file)
@@ -212,7 +212,7 @@ test_gdb_complete "ambiguous_func" \
 # However, we want to sanity-check each one of them, knowing that
 # each result should start with "break ada" and that the proposed
 # completion should look like a valid symbol name (in particular,
-# no uppercase letters...).
+# no uppercase letters...).  See gdb/22670.
 
 gdb_test_no_output "set max-completions unlimited"
 
@@ -222,6 +222,6 @@ gdb_test_multiple "$test" $test {
         pass $test
     }
     -re "\[A-Z\].*$gdb_prompt $" {
-        kfail gdb/22670 $test
+       fail "$test (gdb/22670)"
     }
 }