From: Pierre-Marie de Rodat Date: Wed, 19 Aug 2015 15:12:48 +0000 (+0200) Subject: [Ada] Fix parsing for expressions with attributes and characters X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=af39b3270a1385027b2a5d145b9ba7564bd39f7a;p=binutils-gdb.git [Ada] Fix parsing for expressions with attributes and characters Before this change, trying to evaluate the following Ada expression yielded a syntax error, even though it's completely legal: (gdb) p s'first = 'a' Error in expression, near `'. The problem lies in the lexer (gdb/ada-lex.l): at the point we reach "'a'", we're still in the BEFORE_QUAL_QUOTE start condition (the mechanism to distinguish character literals from other "tick" usages: qualified expressions and attributes), so we consider that this quote is actually a separate "tick". This changes resets the start condition to INITIAL in the {TICK}[a-zA-Z][a-zA-Z]+ rule (for attributes): attributes activate this BEFORE_QUAL_QUOTE condition and in this case the above rule is always executed rather than the "'" one (in flex, it's always the longest match that is chosen). We now have instead: (gdb) p s'first = 'a' $1 = true gdb/ChangeLog: * ada-lex.l: Reset the start condition to INITIAL in the rule that matches attributes. gdb/testsuite/ChangeLog: * gdb.ada/attr_ref_and_charlit.exp: New testcase. * gdb.ada/attr_ref_and_charlit/foo.adb: New file. Tested on x86_64-linux, no regression. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b510cbc1c16..a9092cc469b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-08-20 Pierre-Marie de Rodat + + * ada-lex.l: Reset the start condition to INITIAL in the rule that + matches attributes. + 2015-08-19 Kevin Buettner * dwarf2read.c (dwarf2_string_attr): New function. diff --git a/gdb/ada-lex.l b/gdb/ada-lex.l index 7ef6efb0553..1a93a5ce960 100644 --- a/gdb/ada-lex.l +++ b/gdb/ada-lex.l @@ -205,7 +205,7 @@ false { return FALSEKEYWORD; } /* ATTRIBUTES */ -{TICK}[a-zA-Z][a-zA-Z]+ { return processAttribute (yytext+1); } +{TICK}[a-zA-Z][a-zA-Z]+ { BEGIN INITIAL; return processAttribute (yytext+1); } /* PUNCTUATION */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 955c9f73fdb..2fecd361a25 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-08-20 Pierre-Marie de Rodat + + * gdb.ada/attr_ref_and_charlit.exp: New testcase. + * gdb.ada/attr_ref_and_charlit/foo.adb: New file. + 2015-08-19 Kevin Buettner * gdb.dwarf2/dw2-bad-mips-linkage-name.c: New file. diff --git a/gdb/testsuite/gdb.ada/attr_ref_and_charlit.exp b/gdb/testsuite/gdb.ada/attr_ref_and_charlit.exp new file mode 100644 index 00000000000..2c8bbfb1a15 --- /dev/null +++ b/gdb/testsuite/gdb.ada/attr_ref_and_charlit.exp @@ -0,0 +1,42 @@ +# Copyright 2015 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib "ada.exp" + +standard_ada_testfile "foo" + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } { + return -1 +} + +clean_restart ${testfile} +set bp_location [gdb_get_line_number "BREAK" "${testdir}/foo.adb"] + +# Check with the same array at two different points in the execution that using +# both an attribute reference and a character literal in the same expression +# work as expected. They used to yield syntax error. + +runto "foo.adb:$bp_location" +gdb_test "print s'first" " = 2" +gdb_test "print s'last" " = 3" +gdb_test "print s(s'first) = 'a'" " = true" +gdb_test "print s(s'last) /= 'b'" " = false" + +gdb_test "continue" \ + ".*Breakpoint \[0-9\]+, foo\\.p \\(s=.*\\) at .*foo.adb:\[0-9\]+.*" \ +gdb_test "print s'first" " = 4" +gdb_test "print s'last" " = 5" +gdb_test "print s(s'first) = 'c'" " = true" +gdb_test "print s(s'last) /= 'd'" " = false" diff --git a/gdb/testsuite/gdb.ada/attr_ref_and_charlit/foo.adb b/gdb/testsuite/gdb.ada/attr_ref_and_charlit/foo.adb new file mode 100644 index 00000000000..10421fa927b --- /dev/null +++ b/gdb/testsuite/gdb.ada/attr_ref_and_charlit/foo.adb @@ -0,0 +1,24 @@ +-- Copyright 2015 Free Software Foundation, Inc. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +procedure Foo is + procedure P (S : String) is + begin + null; -- BREAK + end P; +begin + P ((2 => 'a', 3 => 'b')); + P ((4 => 'c', 5 => 'd')); +end Foo;