From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 103393 invoked by alias); 19 Aug 2015 15:25:09 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 103383 invoked by uid 89); 19 Aug 2015 15:25:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.0 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 X-HELO: smtp.eu.adacore.com Received: from mel.act-europe.fr (HELO smtp.eu.adacore.com) (194.98.77.210) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 19 Aug 2015 15:25:02 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 8C74B28F1D06; Wed, 19 Aug 2015 17:24:59 +0200 (CEST) Received: from smtp.eu.adacore.com ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id mXMQyqodByyY; Wed, 19 Aug 2015 17:24:59 +0200 (CEST) Received: from cacatoes.act-europe.fr (cacatoes.act-europe.fr [10.10.1.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) by smtp.eu.adacore.com (Postfix) with ESMTPSA id 79D0A28F1CC5; Wed, 19 Aug 2015 17:24:59 +0200 (CEST) From: Pierre-Marie de Rodat To: gdb-patches@sourceware.org Cc: Pierre-Marie de Rodat Subject: [PATCH] [Ada] Fix parsing for expressions with attributes and characters Date: Wed, 19 Aug 2015 15:25:00 -0000 Message-Id: <1439997888-3855-1-git-send-email-derodat@adacore.com> X-IsSubscribed: yes X-SW-Source: 2015-08/txt/msg00519.txt.bz2 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. --- gdb/ada-lex.l | 2 +- gdb/testsuite/gdb.ada/attr_ref_and_charlit.exp | 42 ++++++++++++++++++++++ gdb/testsuite/gdb.ada/attr_ref_and_charlit/foo.adb | 24 +++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.ada/attr_ref_and_charlit.exp create mode 100644 gdb/testsuite/gdb.ada/attr_ref_and_charlit/foo.adb diff --git a/gdb/ada-lex.l b/gdb/ada-lex.l index 7ef6efb..1a93a5c 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/gdb.ada/attr_ref_and_charlit.exp b/gdb/testsuite/gdb.ada/attr_ref_and_charlit.exp new file mode 100644 index 0000000..2c8bbfb --- /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 0000000..10421fa --- /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; -- 2.4.6