gdb/modula-2: parsing of multi-subscript arrays

Fix bug PR m2/26372, GDB's inability to parse multi-dimensional
modula-2 arrays.

We previously had two rules for handling the parsing of array
sub-scripts.  I have reproduced them here with the actual handler
blocks removed to make the bug clearer:

  exp     :    exp '[' non_empty_arglist ']'
          ;

  exp     :    exp '[' exp ']'
          ;

  non_empty_arglist
          :       exp
          ;

  non_empty_arglist
          :       non_empty_arglist ',' exp
          ;

This is ambiguous as the pattern "exp '[' exp" could match either of
the 'exp' rules.  Currently it just so happens that the parser picks
the second 'exp' rule which means we can only handle a single array
index.

As the handler code for the first 'exp' pattern will correctly handle
and number of array indexes then lets just remove the second pattern.

gdb/ChangeLog:

	PR m2/26372
        * m2-exp.y (exp): Improve comment for non_empty_arglist case, add
	an assert.  Remove single element array indexing pattern as the
	MULTI_SUBSCRIPT support will handle this case too.

gdb/testsuite/ChangeLog:

	PR m2/26372
        * gdb.modula2/multidim.c: New file.
        * gdb.modula2/multidim.exp: New file.
This commit is contained in:
Gaius Mulley
2020-08-25 09:39:27 +01:00
committed by Andrew Burgess
parent 419cca029e
commit 3945d2d77e
5 changed files with 96 additions and 7 deletions

View File

@ -1,3 +1,11 @@
2020-08-25 Gaius Mulley <gaiusmod2@gmail.com>
Andrew Burgess <andrew.burgess@embecosm.com>
PR m2/26372
* m2-exp.y (exp): Improve comment for non_empty_arglist case, add
an assert. Remove single element array indexing pattern as the
MULTI_SUBSCRIPT support will handle this case too.
2020-08-24 Simon Marchi <simon.marchi@polymtl.ca>
* value.h (valprint_check_validity): Move declaration from

View File

@ -293,21 +293,20 @@ set : '{' arglist '}'
;
/* Modula-2 array subscript notation [a,b,c...] */
/* Modula-2 array subscript notation [a,b,c...]. */
exp : exp '['
/* This function just saves the number of arguments
that follow in the list. It is *not* specific to
function types */
{ pstate->start_arglist(); }
non_empty_arglist ']' %prec DOT
{ write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
{
gdb_assert (pstate->arglist_len > 0);
write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
write_exp_elt_longcst (pstate,
pstate->end_arglist());
write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT); }
;
exp : exp '[' exp ']'
{ write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT); }
write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
}
;
exp : exp '('

View File

@ -1,3 +1,9 @@
2020-08-25 Gaius Mulley <gaiusmod2@gmail.com>
PR m2/26372
* gdb.modula2/multidim.c: New file.
* gdb.modula2/multidim.exp: New file.
2020-08-24 Simon Marchi <simon.marchi@polymtl.ca>
* lib/gdb.exp (runto): Always emit fail on internal error.

View File

@ -0,0 +1,39 @@
/* This test script is part of GDB, the GNU debugger.
Copyright 2020 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 <http://www.gnu.org/licenses/>. */
static int a[10][20];
static void
here (void)
{
}
int
main ()
{
int i, j;
int count = 0;
for (i = 0; i < 10; i++)
for (j = 0; j < 20; j++)
{
a[i][j] = count;
count += 1;
}
here ();
}

View File

@ -0,0 +1,37 @@
# Copyright 2020 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 <http://www.gnu.org/licenses/>.
# This file is part of the gdb testsuite. It contains tests for printing
# the elements of an unbounded array using the Modula-2 language mode of
# gdb.
standard_testfile multidim.c
if {[prepare_for_testing "failed to prepare" $testfile $srcfile \
{debug quiet}]} {
return -1
}
if ![runto here] then {
perror "couldn't run to breakpoint 'here'"
continue
}
gdb_test "set lang modula-2" ".*does not match.*" "switch to modula-2"
gdb_test "print a\[1,2\]" ".*= 22.*" "second row third column"
gdb_test "print a\[2,1\]" ".*= 41.*" "fifth row second column"
gdb_test "print a\[a\[0,1\],a\[0,2\]\]" ".*= 22.*" \
"second row third column again"