Re: Patch: Fix for Bug 26372 [Modula-2] Parsing of multi-subscript arrays

Tom de Vries <[email protected]>
Newsgroups gmane.comp.gdb.patches,gmane.comp.gdb.devel
Message-ID <[email protected]>
On 8/25/20 4:29 AM, Gaius Mulley wrote:
> 
> 
> Hi Tom,
> 
> here is a bugfix for Pr 26372 [Modula-2] Parsing of multi-subscript arrays.
> Also included is a dejagnu testcase.  No extra regressions are caused on
> Debian GNU/Linux Buster amd64, is this ok to apply?
> 

Hi Gaius,

I ran into some trouble applying the patch with the patch program, so I
applied the patch manually, and then diffed the result of that with the
original patch and fixed whitespace problems in the original patch until
I got duplicates, to ensure that the application process was sane.

I verified that when building with the patch, the warning "rule useless
in parser due to conflicts" is gone, and no new warnings are introduced.

I ran the test-case and verified that it failed without and passed with
the patch.

I've also fixed the ChangeLog entry a bit (multidim.y -> multidim.exp)
and split it up for gdb/ChangeLog and gdb/testsuite/Changelog, as well
as added a PR number.

I've gone ahead an applied it (with you as author, obviously).  See
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=07758bdfa9e5a762f2ec0deeb51b11d6ad5fe376
.

Attached here for reference.

Thanks,
- Tom
0001-Fix-for-Bug-26372-Modula-2-Parsing-of-multi-subscript-arrays.patch (text/x-patch, 5.4 KB)
Fix for Bug 26372 [Modula-2] Parsing of multi-subscript arrays

Here is a bugfix for Pr 26372 [Modula-2] Parsing of multi-subscript arrays.
Also included is a dejagnu testcase.  No extra regressions are caused on
Debian GNU/Linux Buster amd64.

gdb/ChangeLog:

2020-08-25  Gaius Mulley  <[email protected]>

	PR m2/26372
	* m2-exp.y: Rewrite array subscript rules to support multidimension
	array access.  (ArgumentList) replaces non_empty_arglist.

gdb/testsuite/ChangeLog:

2020-08-25  Gaius Mulley  <[email protected]>

	PR m2/26372
	* testsuite/gdb.modula2/multidim.exp: New file.
	* testsuite/gdb.modula2/multidim.c: New file.

---
 gdb/m2-exp.y                           | 45 +++++++++++++++-------------------
 gdb/testsuite/gdb.modula2/multidim.c   | 39 +++++++++++++++++++++++++++++
 gdb/testsuite/gdb.modula2/multidim.exp | 34 +++++++++++++++++++++++++
 3 files changed, 93 insertions(+), 25 deletions(-)

diff --git a/gdb/m2-exp.y b/gdb/m2-exp.y
index 70a3d9c483..dba331f405 100644
--- a/gdb/m2-exp.y
+++ b/gdb/m2-exp.y
@@ -293,21 +293,18 @@ set	:	'{' arglist '}'
 	;
 
 
-/* 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);
-			  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); }
+/* Modula-2 array subscript notation [a,b,c...].  */
+exp     :       exp '[' ArgumentList ']' %prec DOT
+                {
+                    if (pstate->arglist_len > 1)
+		      {
+			write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
+			write_exp_elt_longcst (pstate, pstate->arglist_len);
+			write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
+		      }
+		    else
+		      write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT);
+		}
 	;
 
 exp	:	exp '('
@@ -321,24 +318,22 @@ exp	:	exp '('
 			  write_exp_elt_opcode (pstate, OP_FUNCALL); }
 	;
 
-arglist	:
-	;
-
-arglist	:	exp
+/* Non empty argument list.  */
+ArgumentList:
+	exp
 			{ pstate->arglist_len = 1; }
+|	ArgumentList ',' exp
+		{ pstate->arglist_len++; }
 	;
 
-arglist	:	arglist ',' exp   %prec ABOVE_COMMA
-			{ pstate->arglist_len++; }
+arglist	:
 	;
 
-non_empty_arglist
-        :       exp
+arglist	:	exp
                         { pstate->arglist_len = 1; }
 	;
 
-non_empty_arglist
-        :       non_empty_arglist ',' exp %prec ABOVE_COMMA
+arglist	:	arglist ',' exp   %prec ABOVE_COMMA
      	       	    	{ pstate->arglist_len++; }
      	;
 
diff --git a/gdb/testsuite/gdb.modula2/multidim.c b/gdb/testsuite/gdb.modula2/multidim.c
new file mode 100644
index 0000000000..b0ce848868
--- /dev/null
+++ b/gdb/testsuite/gdb.modula2/multidim.c
@@ -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 ();
+}
diff --git a/gdb/testsuite/gdb.modula2/multidim.exp b/gdb/testsuite/gdb.modula2/multidim.exp
new file mode 100644
index 0000000000..df7054892a
--- /dev/null
+++ b/gdb/testsuite/gdb.modula2/multidim.exp
@@ -0,0 +1,34 @@
+# 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 foo"
+    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"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.