https://gcc.gnu.org/g:585aa4065f1028c2fbfab55462e5e5e6b3c208c4

commit r15-7786-g585aa4065f1028c2fbfab55462e5e5e6b3c208c4
Author: Gaius Mulley <gaiusm...@gmail.com>
Date:   Sun Mar 2 19:04:37 2025 +0000

    PR modula2/119088 ICE when for loop accesses an unknown variable as the 
iterator
    
    This patch fixes an ICE which occurs when a FOR statement attempts to
    use an undeclared variable as its iterator.
    
    gcc/m2/ChangeLog:
    
            PR modula2/119088
            * gm2-compiler/M2SymInit.mod (ConfigSymInit): Reimplement to
            defensively check for NulSym type.
    
    gcc/testsuite/ChangeLog:
    
            PR modula2/119088
            * gm2/pim/fail/tinyfor4.mod: New test.
    
    Signed-off-by: Gaius Mulley <gaiusm...@gmail.com>

Diff:
---
 gcc/m2/gm2-compiler/M2SymInit.mod       | 21 ++++++++++++++-------
 gcc/testsuite/gm2/pim/fail/tinyfor4.mod |  7 +++++++
 2 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/gcc/m2/gm2-compiler/M2SymInit.mod 
b/gcc/m2/gm2-compiler/M2SymInit.mod
index ffe1f9b8da33..6c8912f2c4c0 100644
--- a/gcc/m2/gm2-compiler/M2SymInit.mod
+++ b/gcc/m2/gm2-compiler/M2SymInit.mod
@@ -202,16 +202,23 @@ BEGIN
       desc^.sym := sym ;
       desc^.type := GetSType (sym) ;
       desc^.initialized := FALSE ;
-      IF IsRecord (desc^.type)
+      (* An unknown symbol will have no type.  *)
+      IF desc^.type = NulSym
       THEN
-         desc^.kind := record ;
-         desc^.rec.fieldDesc := Indexing.InitIndex (1) ;
-         PopulateFields (desc, desc^.type)
-      ELSE
          desc^.kind := scalar ;
-         IF IsArray (desc^.type)
+         desc^.initialized := TRUE   (* For now we don't attempt to handle 
array types.  *)
+      ELSE
+         IF IsRecord (desc^.type)
          THEN
-            desc^.initialized := TRUE   (* For now we don't attempt to handle 
array types.  *)
+            desc^.kind := record ;
+            desc^.rec.fieldDesc := Indexing.InitIndex (1) ;
+            PopulateFields (desc, desc^.type)
+         ELSE
+            desc^.kind := scalar ;
+            IF IsArray (desc^.type)
+            THEN
+               desc^.initialized := TRUE   (* For now we don't attempt to 
handle array types.  *)
+            END
          END
       END
    END
diff --git a/gcc/testsuite/gm2/pim/fail/tinyfor4.mod 
b/gcc/testsuite/gm2/pim/fail/tinyfor4.mod
new file mode 100644
index 000000000000..155b72565da0
--- /dev/null
+++ b/gcc/testsuite/gm2/pim/fail/tinyfor4.mod
@@ -0,0 +1,7 @@
+MODULE tinyfor4 ;  
+
+VAR
+  v: INTEGER;
+BEGIN
+   FOR i := 0 TO v DO END
+END tinyfor4.

Reply via email to