[gcc r16-1347] PR modula2/120606: FOR loop ICE if the last expression uses an array
Gaius Mulley
gaius@gcc.gnu.org
Mon Jun 9 17:27:20 GMT 2025
https://gcc.gnu.org/g:639a147414ab2b870f9482123fcaa1821e0d5475
commit r16-1347-g639a147414ab2b870f9482123fcaa1821e0d5475
Author: Gaius Mulley <gaiusmod2@gmail.com>
Date: Mon Jun 9 18:26:36 2025 +0100
PR modula2/120606: FOR loop ICE if the last expression uses an array
This patch fixes the ICE which occurs if the last expression is an array.
It ensures that the start and end values of the for loop expressions are
dereferenced.
gcc/m2/ChangeLog:
PR modula2/120606
* gm2-compiler/M2Quads.mod (ForLoopLastIterator): Dereference
start and end expressions e1 and e2 respectively.
gcc/testsuite/ChangeLog:
PR modula2/120606
* gm2/pim/pass/forarray.mod: New test.
Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
Diff:
---
gcc/m2/gm2-compiler/M2Quads.mod | 2 ++
gcc/testsuite/gm2/pim/pass/forarray.mod | 21 +++++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/gcc/m2/gm2-compiler/M2Quads.mod b/gcc/m2/gm2-compiler/M2Quads.mod
index b5455d09c66f..748ce2498dbb 100644
--- a/gcc/m2/gm2-compiler/M2Quads.mod
+++ b/gcc/m2/gm2-compiler/M2Quads.mod
@@ -4646,6 +4646,8 @@ BEGIN
BySym) ;
MetaErrorDecl (BySym, TRUE)
ELSE
+ e1 := DereferenceLValue (e1tok, e1) ;
+ e2 := DereferenceLValue (e2tok, e2) ;
GenQuadOTypetok (bytok, LastForIteratorOp, LastIterator,
Make2Tuple (e1, e2), BySym, FALSE, FALSE,
bytok, MakeVirtual2Tok (e1tok, e2tok), bytok)
diff --git a/gcc/testsuite/gm2/pim/pass/forarray.mod b/gcc/testsuite/gm2/pim/pass/forarray.mod
new file mode 100644
index 000000000000..e1b41e793bc0
--- /dev/null
+++ b/gcc/testsuite/gm2/pim/pass/forarray.mod
@@ -0,0 +1,21 @@
+MODULE forarray ;
+
+
+VAR
+ array: ARRAY [0..10] OF CARDINAL ;
+
+
+PROCEDURE Init ;
+VAR
+ i, n: CARDINAL ;
+BEGIN
+ array[0] := 10 ;
+ n := 0 ;
+ FOR i := 1 TO array[n] DO
+ END
+END Init ;
+
+
+BEGIN
+ Init
+END forarray.
More information about the Gcc-cvs
mailing list