Fix bug in Ada attributes lexing
authorTom Tromey <tromey@adacore.com>
Tue, 22 Feb 2022 19:02:10 +0000 (12:02 -0700)
committerTom Tromey <tromey@adacore.com>
Mon, 4 Apr 2022 18:46:08 +0000 (12:46 -0600)
The Ada lexer allows whitespace between the apostrophe and the
attribute text, but processAttribute does not handle this.  This patch
fixes the problem and introduces a regression test.

gdb/ada-lex.l
gdb/testsuite/gdb.ada/formatted_ref.exp

index a0c9816e5683c737a7ee6bf9763a49b78f2487f9..c6ce1aec53adec731213e2ecff009723d8f25522 100644 (file)
@@ -227,7 +227,7 @@ false               { return FALSEKEYWORD; }
 
         /* ATTRIBUTES */
 
-{TICK}[a-z][a-z_]+ { BEGIN INITIAL; return processAttribute (yytext+1); }
+{TICK}[a-z][a-z_]+ { BEGIN INITIAL; return processAttribute (yytext); }
 
        /* PUNCTUATION */
 
@@ -663,6 +663,11 @@ attributes[] = {
 static int
 processAttribute (const char *str)
 {
+  gdb_assert (*str == '\'');
+  ++str;
+  while (isspace (*str))
+    ++str;
+
   for (const auto &item : attributes)
     if (strcasecmp (str, item.name) == 0)
       return item.code;
index bb5f78c0d723a8cf5064c4057d9fb682acc470be..882dbf177251966c2fcd9ce4ab6b31a030b7d398 100644 (file)
@@ -70,13 +70,15 @@ proc test_p_x_addr { var addr } {
     global gdb_prompt
 
     foreach attr {access unchecked_access unrestricted_access} {
-       set test "print/x $var'$attr"
-       gdb_test_multiple $test $test {
-           -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" {
-               pass $test
-           }
-           -re "\\$\[0-9\]+ = 0x\[a-f0-9+\]+.*$gdb_prompt $" {
-               fail "$test (prints unexpected address)"
+       foreach space {"" "  "} {
+           set test "print/x $var'$space$attr"
+           gdb_test_multiple $test $test {
+               -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" {
+                   pass $test
+               }
+               -re "\\$\[0-9\]+ = 0x\[a-f0-9+\]+.*$gdb_prompt $" {
+                   fail "$test (prints unexpected address)"
+               }
            }
        }
     }