https://gcc.gnu.org/g:99d537558ebffb52cb8f784ab550b962958fedef

commit r14-10982-g99d537558ebffb52cb8f784ab550b962958fedef
Author: Gaius Mulley <gaiusm...@gmail.com>
Date:   Tue Nov 26 12:57:12 2024 +0000

    [PATCH] PR modula2/115957 ICE on procedure local const declaration
    
    An ICE would occur if a constant was declared using a variable term.
    This fix catches variable terms in constant expressions and generates
    an unrecoverable error.
    
    gcc/m2/ChangeLog:
    
            PR modula2/115957
            * gm2-compiler/M2StackAddress.mod (PopAddress): Detect tail=NIL
            and generate an internal error.
            * gm2-compiler/PCBuild.bnf (InConstParameter): New variable.
            (InConstBlock): New variable.
            (ErrorString): Rewrite using MetaErrorStringT0.
            (ErrorArrayAt): Rewrite using MetaErrorStringT0.
            (WarnMissingToken): Use MetaErrorStringT0.
            (CompilationUnit): Set seenError FALSE.
            (init): Initialize InConstParameter and InConstBlock.
            (ConstantDeclaration): Set InConstBlock.
            (ConstSetOrQualidentOrFunction): Call CheckNotVar if not
            InConstParameter and InConstBlock.
            (ConstActualParameters): Set InConstParameter TRUE and restore
            value at the end.
            * gm2-compiler/PCSymBuild.def (CheckNotVar): New procedure.
            Remove all unnecessary export qualified list.
            * gm2-compiler/PCSymBuild.mod (CheckNotVar): New procedure.
    
    gcc/testsuite/ChangeLog:
    
            PR modula2/115957
            * gm2/errors/fail/badconst.mod: New test.
            * gm2/pim/fail/tinyadr.mod: New test.
    
    (cherry picked from commit d9709fafb2c498ba2f4c920f953c9b78fa3bf114)
    
    Signed-off-by: Gaius Mulley <gaiusm...@gmail.com>

Diff:
---
 gcc/m2/gm2-compiler/M2StackAddress.mod     | 11 +++++---
 gcc/m2/gm2-compiler/PCBuild.bnf            | 40 +++++++++++++++++++++---------
 gcc/m2/gm2-compiler/PCSymBuild.def         | 38 +++++-----------------------
 gcc/m2/gm2-compiler/PCSymBuild.mod         | 18 +++++++++++++-
 gcc/testsuite/gm2/errors/fail/badconst.mod | 19 ++++++++++++++
 gcc/testsuite/gm2/pim/fail/tinyadr.mod     | 12 +++++++++
 6 files changed, 90 insertions(+), 48 deletions(-)

diff --git a/gcc/m2/gm2-compiler/M2StackAddress.mod 
b/gcc/m2/gm2-compiler/M2StackAddress.mod
index c7262dce3b38..ff65b42059c4 100644
--- a/gcc/m2/gm2-compiler/M2StackAddress.mod
+++ b/gcc/m2/gm2-compiler/M2StackAddress.mod
@@ -157,9 +157,14 @@ BEGIN
             END ;
             DISPOSE(b)
          END ;
-         WITH s^.tail^ DO
-            DEC(items) ;
-            RETURN( bucket[items] )
+         IF s^.tail = NIL
+         THEN
+            InternalError ('stack underflow')
+         ELSE
+            WITH s^.tail^ DO
+               DEC(items) ;
+               RETURN( bucket[items] )
+            END
          END
       END
    END
diff --git a/gcc/m2/gm2-compiler/PCBuild.bnf b/gcc/m2/gm2-compiler/PCBuild.bnf
index 46f46af73ffe..0e45b2e889cc 100644
--- a/gcc/m2/gm2-compiler/PCBuild.bnf
+++ b/gcc/m2/gm2-compiler/PCBuild.bnf
@@ -47,7 +47,7 @@ IMPLEMENTATION MODULE PCBuild ;
 FROM M2LexBuf IMPORT currentstring, currenttoken, GetToken, InsertToken,
                      InsertTokenAndRewind, GetTokenNo, MakeVirtualTok ;
 
-FROM M2Error IMPORT ErrorStringAt, WriteFormat1, WriteFormat2 ;
+FROM M2MetaError IMPORT MetaErrorStringT0 ;
 FROM NameKey IMPORT NulName, Name, makekey ;
 FROM DynamicStrings IMPORT String, InitString, KillString, Mark, ConCat, 
ConCatChar ;
 FROM M2Printf IMPORT printf0 ;
@@ -102,7 +102,8 @@ FROM PCSymBuild IMPORT PCStartBuildProgModule,
                        PushConstType,
                        PushConstAttributeType,
                        PushConstAttributePairType,
-                       PushRType ;
+                       PushRType,
+                       CheckNotVar ;
 
 FROM SymbolTable IMPORT MakeGnuAsm, PutGnuAsmVolatile, PutGnuAsm, 
PutGnuAsmInput,
                         PutGnuAsmOutput, PutGnuAsmTrash, PutGnuAsmVolatile,
@@ -127,13 +128,15 @@ CONST
    Pass1     = FALSE ;
 
 VAR
-   WasNoError  : BOOLEAN ;
+   InConstParameter,
+   InConstBlock,
+   seenError       : BOOLEAN ;
 
 
 PROCEDURE ErrorString (s: String) ;
 BEGIN
-   ErrorStringAt (s, GetTokenNo ()) ;
-   WasNoError := FALSE
+   MetaErrorStringT0 (GetTokenNo (), s) ;
+   seenError := TRUE
 END ErrorString ;
 
 
@@ -145,7 +148,7 @@ END ErrorArray ;
 
 PROCEDURE ErrorArrayAt (a: ARRAY OF CHAR; tok: CARDINAL) ;
 BEGIN
-   ErrorStringAt (InitString(a), tok)
+   MetaErrorStringT0 (tok, InitString (a))
 END ErrorArrayAt ;
 
 
@@ -220,7 +223,7 @@ BEGIN
    str := DescribeStop(s0, s1, s2) ;
 
    str := ConCat(InitString('syntax error,'), Mark(str)) ;
-   ErrorStringAt(str, GetTokenNo())
+   MetaErrorStringT0 (GetTokenNo (), str)
 END WarnMissingToken ;
 
 
@@ -338,9 +341,9 @@ END Expect ;
 
 PROCEDURE CompilationUnit () : BOOLEAN ;
 BEGIN
-   WasNoError := TRUE ;
+   seenError := FALSE ;
    FileUnit(SetOfStop0{eoftok}, SetOfStop1{}, SetOfStop2{}) ;
-   RETURN( WasNoError )
+   RETURN NOT seenError
 END CompilationUnit ;
 
 
@@ -403,6 +406,9 @@ BEGIN
 END Real ;
 
 % module PCBuild end
+BEGIN
+   InConstParameter := FALSE ;
+   InConstBlock := FALSE
 END PCBuild.
 % rules
 error       'ErrorArray' 'ErrorString'
@@ -591,6 +597,7 @@ Qualident :=                                                
               % VAR
            =:
 
 ConstantDeclaration :=                                                     % 
VAR top: CARDINAL ; %
+                                                                           % 
InConstBlock := TRUE %
                                                                            % 
top := Top() %
                                                                            % 
PushAutoOn %
                        ( Ident "="                                         % 
StartDesConst %
@@ -600,6 +607,7 @@ ConstantDeclaration :=                                      
               % VAR
                                                                            % 
EndDesConst %
                                                                            % 
PopAuto %
                                                                            % 
Assert(top=Top()) %
+                                                                           % 
InConstBlock := FALSE %
                      =:
 
 ConstExpression :=                                                         % 
VAR top: CARDINAL ; %
@@ -706,7 +714,10 @@ ConstSetOrQualidentOrFunction :=                           
                % Pus
                                                                            % 
VAR tokpos: CARDINAL ; %
                                                                            % 
tokpos := GetTokenNo () %
                                  (
-                                   PushQualident
+                                   PushQualident                           % 
IF (NOT InConstParameter) AND InConstBlock
+                                                                             
THEN
+                                                                               
 CheckNotVar (tokpos)
+                                                                             
END %
                                    ( ConstructorOrConstActualParameters |  % 
PushConstType %
                                                                            % 
PopNothing %
                                                                           )
@@ -714,8 +725,13 @@ ConstSetOrQualidentOrFunction :=                           
                % Pus
                                      Constructor )                         % 
PopAuto %
                                =:
 
-ConstActualParameters :=                                                   % 
PushT(0) %
-                         "(" [ ConstExpList ] ")" =:
+ConstActualParameters :=                                                   % 
VAR oldConstParameter: BOOLEAN ; %
+                                                                           % 
oldConstParameter := InConstParameter %
+                                                                           % 
InConstParameter := TRUE %
+                                                                           % 
PushT(0) %
+                         "(" [ ConstExpList ] ")"
+                                                                           % 
InConstParameter := oldConstParameter %
+                         =:
 
 ConstExpList :=                                                            % 
VAR n: CARDINAL ; %
                 ConstExpression                                            % 
PopT(n) %
diff --git a/gcc/m2/gm2-compiler/PCSymBuild.def 
b/gcc/m2/gm2-compiler/PCSymBuild.def
index 9ce07adbc61b..c130135d7438 100644
--- a/gcc/m2/gm2-compiler/PCSymBuild.def
+++ b/gcc/m2/gm2-compiler/PCSymBuild.def
@@ -29,38 +29,12 @@ DEFINITION MODULE PCSymBuild ;
                 the import/export symbols and assigns types to constructors.
 *)
 
-EXPORT QUALIFIED PCStartBuildDefModule,
-                 PCEndBuildDefModule,
-                 PCStartBuildImpModule,
-                 PCEndBuildImpModule,
-                 PCStartBuildProgModule,
-                 PCEndBuildProgModule,
-                 PCStartBuildInnerModule,
-                 PCEndBuildInnerModule,
-                 PCBuildProcedureHeading,
-                 PCStartBuildProcedure,
-                 PCEndBuildProcedure,
-                 BuildNulName,
-                 BuildConst,
-                 PCBuildImportOuterModule,
-                 PCBuildImportInnerModule,
-                 StartDesConst,
-                 EndDesConst,
-                 BuildRelationConst,
-                 BuildUnaryConst,
-                 BuildBinaryConst,
-                 PushInConstructor,
-                 PopInConstructor,
-                 SkipConst,
-                 PushConstType,
-                 PushConstAttributeType,
-                 PushConstAttributePairType,
-                 PushConstructorCastType,
-                 PushRType,
-                 PushConstFunctionType,
-                 PushIntegerType,
-                 PushStringType,
-                 ResolveConstTypes ;
+
+(*
+   CheckNotVar - checks to see that the top of stack is not a variable.
+*)
+
+PROCEDURE CheckNotVar (tok: CARDINAL) ;
 
 
 (*
diff --git a/gcc/m2/gm2-compiler/PCSymBuild.mod 
b/gcc/m2/gm2-compiler/PCSymBuild.mod
index 6d615b9a311c..fd1fd075bbe0 100644
--- a/gcc/m2/gm2-compiler/PCSymBuild.mod
+++ b/gcc/m2/gm2-compiler/PCSymBuild.mod
@@ -78,7 +78,7 @@ FROM SymbolTable IMPORT NulSym, ModeOfAddr,
                         IsParameterVar, PutProcTypeParam,
                         PutProcTypeVarParam, IsParameterUnbounded,
                         PutFunction, PutProcTypeParam,
-                        GetType,
+                        GetType, IsVar,
                         IsAModula2Type, GetDeclaredMod ;
 
 FROM M2Batch IMPORT MakeDefinitionSource,
@@ -192,6 +192,22 @@ BEGIN
 END GetSkippedType ;
 
 
+(*
+   CheckNotVar - checks to see that the top of stack is not a variable.
+*)
+
+PROCEDURE CheckNotVar (tok: CARDINAL) ;
+VAR
+   const: CARDINAL ;
+BEGIN
+   const := OperandT (1) ;
+   IF (const # NulSym) AND IsVar (const)
+   THEN
+      MetaErrorT1 (tok, 'not expecting a variable {%Aad} as a term in a 
constant expression', const)
+   END
+END CheckNotVar ;
+
+
 (*
    StartBuildDefinitionModule - Creates a definition module and starts
                                 a new scope.
diff --git a/gcc/testsuite/gm2/errors/fail/badconst.mod 
b/gcc/testsuite/gm2/errors/fail/badconst.mod
new file mode 100644
index 000000000000..1820b6f33864
--- /dev/null
+++ b/gcc/testsuite/gm2/errors/fail/badconst.mod
@@ -0,0 +1,19 @@
+MODULE badconst ;
+
+IMPORT SYSTEM;
+
+TYPE
+   T = POINTER TO CONS;
+   CONS = RECORD
+             CAR: SYSTEM.ADDRESS;
+             CDR: T;
+          END ;
+
+PROCEDURE POP(VAR LST: T): SYSTEM.ADDRESS;
+CONST CAR = LST.CAR;
+BEGIN
+   RETURN NIL;
+END POP;
+
+BEGIN
+END badconst.
diff --git a/gcc/testsuite/gm2/pim/fail/tinyadr.mod 
b/gcc/testsuite/gm2/pim/fail/tinyadr.mod
new file mode 100644
index 000000000000..2f79469f0ca9
--- /dev/null
+++ b/gcc/testsuite/gm2/pim/fail/tinyadr.mod
@@ -0,0 +1,12 @@
+MODULE tinyadr ;
+
+FROM SYSTEM IMPORT ADR ;
+
+CONST
+   foo = ADR (bar) ;
+
+VAR
+   bar: CARDINAL ;
+BEGIN
+
+END tinyadr.

Reply via email to