public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/modula-2] Bugfix detect assigning constant constructors within a code block.
@ 2022-11-25 15:11 Gaius Mulley
  0 siblings, 0 replies; only message in thread
From: Gaius Mulley @ 2022-11-25 15:11 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:806751e5e9490cc195581681b2b7eeb044b864f5

commit 806751e5e9490cc195581681b2b7eeb044b864f5
Author: Gaius Mulley <gaiusmod2@gmail.com>
Date:   Fri Nov 25 15:10:17 2022 +0000

    Bugfix detect assigning constant constructors within a code block.
    
    gcc/m2/ChangeLog:
    
            * gm2-compiler/M2Quads.def (BuildAssignConstant):
            Exported.
            * gm2-compiler/M2Quads.mod (BuildAssignConstant): New
            procedure.  (BuildAssignment) check whether designator
            is a constant and generate an error.
            * gm2-compiler/P3Build.bnf: Call BuildAssignConstant
            during ConstStatement.  Pass tokenno down to constant
            constructor parameters.
            * gm2-compiler/PHBuild.bnf: Call BuildAssignConstant
            during ConstStatement.
    
    Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>

Diff:
---
 gcc/m2/gm2-compiler/M2Quads.def |  54 +++++++++++++++++-
 gcc/m2/gm2-compiler/M2Quads.mod | 119 ++++++++++++++++++++++++++++++----------
 gcc/m2/gm2-compiler/P3Build.bnf |   9 +--
 gcc/m2/gm2-compiler/PHBuild.bnf |   4 +-
 4 files changed, 149 insertions(+), 37 deletions(-)

diff --git a/gcc/m2/gm2-compiler/M2Quads.def b/gcc/m2/gm2-compiler/M2Quads.def
index bd36812fdde..113ce09cb98 100644
--- a/gcc/m2/gm2-compiler/M2Quads.def
+++ b/gcc/m2/gm2-compiler/M2Quads.def
@@ -40,7 +40,8 @@ EXPORT QUALIFIED StartBuildDefFile, StartBuildModFile, EndBuildFile,
                  BuildRetry,
                  BuildReThrow,
                  BuildBuiltinConst, BuildBuiltinTypeInfo,
-                 BuildAssignment, BuildAlignment,
+                 BuildAssignment, BuildAssignConstant,
+                 BuildAlignment,
                  BuildDefaultFieldAlignment, BuildPragmaField,
                  BuildRepeat, BuildUntil,
                  BuildWhile, BuildDoWhile, BuildEndWhile,
@@ -735,7 +736,8 @@ PROCEDURE BuildBuiltinTypeInfo ;
    BuildAssignment - Builds an assignment from the values given on the
                      quad stack. Either an assignment to an
                      arithmetic expression or an assignment to a
-                     boolean expression.
+                     boolean expression.  This procedure should not
+                     be called in CONST declarations.
                      The Stack is expected to contain:
 
 
@@ -784,6 +786,54 @@ PROCEDURE BuildBuiltinTypeInfo ;
 PROCEDURE BuildAssignment (becomesTokNo: CARDINAL) ;
 
 
+(*
+   BuildAssignConstant - used to create constant in the CONST declaration.
+                         The stack is expected to contain:
+
+       Either
+
+                     Entry                   Exit
+                     =====                   ====
+
+              Ptr ->
+                     +------------+
+                     | Expression |
+                     |------------|
+                     | Designator |
+                     |------------|          +------------+
+                     |            |          |            |  <- Ptr
+                     |------------|          |------------|
+
+
+                     Quadruples Produced
+
+                     q     BecomesOp  Designator  _  Expression
+
+       OR
+
+                     Entry                   Exit
+                     =====                   ====
+
+              Ptr ->
+                     +------------+
+                     | True |False|
+                     |------------|
+                     | Designator |
+                     |------------|          +------------+
+                     |            |          |            |  <- Ptr
+                     |------------|          |------------|
+
+
+                     Quadruples Produced
+
+                     q     BecomesOp  Designator  _  TRUE
+                     q+1   GotoOp                    q+3
+                     q+2   BecomesOp  Designator  _  FALSE
+*)
+
+PROCEDURE BuildAssignConstant (equalsTokNo: CARDINAL) ;
+
+
 (*
    BuildAlignment - builds an assignment to an alignment constant.
 
diff --git a/gcc/m2/gm2-compiler/M2Quads.mod b/gcc/m2/gm2-compiler/M2Quads.mod
index 8b09b00a10d..5be8e770ec2 100644
--- a/gcc/m2/gm2-compiler/M2Quads.mod
+++ b/gcc/m2/gm2-compiler/M2Quads.mod
@@ -3304,7 +3304,8 @@ END CheckBecomesMeta ;
    BuildAssignment - Builds an assignment from the values given on the
                      quad stack. Either an assignment to an
                      arithmetic expression or an assignment to a
-                     boolean expression.
+                     boolean expression.  This procedure should not
+                     be called in CONST declarations.
                      The Stack is expected to contain:
 
 
@@ -3323,22 +3324,89 @@ END CheckBecomesMeta ;
                      |------------|          |------------|
 
 
-                     Quadruples Produced depend of GetMode of Designator and Expression
-
+                     Quadruples Produced
 
-                     Designator = RightValue         Expression = RightValue
                      q     BecomesOp  Designator  _  Expression
 
-                     Designator = RightValue         Expression = LeftValue
-                     q     IndrX      Designator     Expression
+       OR
 
-                     Designator = LeftValue          Expression = RightValue
-                     q     XIndr      Designator     Expression
+                     Entry                   Exit
+                     =====                   ====
+
+              Ptr ->
+                     +------------+
+                     | True |False|
+                     |------------|
+                     | Designator |
+                     |------------|          +------------+
+                     |            |          |            |  <- Ptr
+                     |------------|          |------------|
+
+
+                     Quadruples Produced
 
-                     Designator = LeftValue          Expression = LeftValue
-                     q     IndrX      t              Expression
-                     q+1   XIndr      Designator     t
+                     q     BecomesOp  Designator  _  TRUE
+                     q+1   GotoOp                    q+3
+                     q+2   BecomesOp  Designator  _  FALSE
 
+*)
+
+PROCEDURE BuildAssignment (becomesTokNo: CARDINAL) ;
+VAR
+   des, exp   : CARDINAL ;
+   destok,
+   exptok,
+   combinedtok: CARDINAL ;
+BEGIN
+   des := OperandT (2) ;
+   IF IsConst (des)
+   THEN
+      destok := OperandTok (2) ;
+      exptok := OperandTok (1) ;
+      IF DebugTokPos
+      THEN
+         MetaErrorT1 (destok, 'destok {%1Ead}', des) ;
+         MetaErrorT1 (exptok, 'exptok {%1Ead}', exp)
+      END ;
+      combinedtok := MakeVirtualTok (becomesTokNo, destok, exptok) ;
+      IF IsBoolean (1)
+      THEN
+         MetaErrorT1 (combinedtok,
+                      'cannot assign expression to a constant designator {%1Ead}', des)
+      ELSE
+         exp := OperandT (1) ;
+         MetaErrorT2 (combinedtok,
+                      'cannot assign a constant designator {%1Ead} with an expression {%2Ead}',
+                      des, exp)
+      END
+   ELSE
+      doBuildAssignment (becomesTokNo, TRUE, TRUE)
+   END
+END BuildAssignment ;
+
+
+(*
+   BuildAssignConstant - used to create constant in the CONST declaration.
+                         The stack is expected to contain:
+
+       Either
+
+                     Entry                   Exit
+                     =====                   ====
+
+              Ptr ->
+                     +------------+
+                     | Expression |
+                     |------------|
+                     | Designator |
+                     |------------|          +------------+
+                     |            |          |            |  <- Ptr
+                     |------------|          |------------|
+
+
+                     Quadruples Produced
+
+                     q     BecomesOp  Designator  _  Expression
 
        OR
 
@@ -3355,24 +3423,17 @@ END CheckBecomesMeta ;
                      |------------|          |------------|
 
 
-                     Quadruples Produced depend of GetMode of Designator
+                     Quadruples Produced
 
-                     Designator = RightValue
                      q     BecomesOp  Designator  _  TRUE
                      q+1   GotoOp                    q+3
                      q+2   BecomesOp  Designator  _  FALSE
-
-
-                     Designator = LeftValue
-                     q     XIndr      Designator  _  TRUE
-                     q+1   GotoOp                    q+3
-                     q+2   XIndr      Designator  _  FALSE
 *)
 
-PROCEDURE BuildAssignment (becomesTokNo: CARDINAL) ;
+PROCEDURE BuildAssignConstant (equalsTokNo: CARDINAL) ;
 BEGIN
-   doBuildAssignment (becomesTokNo, TRUE, TRUE)
-END BuildAssignment ;
+   doBuildAssignment (equalsTokNo, TRUE, TRUE)
+END BuildAssignConstant ;
 
 
 (*
@@ -3476,7 +3537,7 @@ BEGIN
       ((DesL#NulSym) AND (NOT IsProcType(DesL)))
    THEN
       MetaError1 ('incorrectly assigning a procedure to a designator {%1Ead} (designator is not a procedure type, {%1ast})', Des)
-   ELSIF IsProcedure(Exp) AND IsProcedureNested(Exp)
+   ELSIF IsProcedure (Exp) AND IsProcedureNested (Exp)
    THEN
       MetaError1 ('cannot call nested procedure {%1Ead} indirectly as the outer scope will not be known', Exp)
    ELSIF IsConstString(Exp)
@@ -3597,7 +3658,7 @@ BEGIN
    GetConstFromFifoQueue (align) ;
    PushT (align) ;
    PushT (expr) ;
-   BuildAssignment (tokno)
+   BuildAssignConstant (tokno)
 END BuildAlignment ;
 
 
@@ -3625,7 +3686,7 @@ BEGIN
    GetConstFromFifoQueue (length) ;
    PushT (length) ;
    PushT (expr) ;
-   BuildAssignment (tokno)
+   BuildAssignConstant (tokno)
 END BuildBitLength ;
 
 
@@ -3659,7 +3720,7 @@ BEGIN
    GetConstFromFifoQueue (align) ;
    PushT (align) ;
    PushT (expr) ;
-   BuildAssignment (GetTokenNo ())
+   BuildAssignConstant (GetTokenNo ())
 END BuildDefaultFieldAlignment ;
 
 
@@ -3695,7 +3756,7 @@ BEGIN
       GetConstFromFifoQueue (const) ;
       PushT (const) ;
       PushT (expr) ;
-      BuildAssignment (GetTokenNo ())
+      BuildAssignConstant (GetTokenNo ())
    END
 END BuildPragmaField ;
 
@@ -10958,7 +11019,7 @@ BEGIN
          PushTFtok (t, GetSType(t), exprTok) ;
          PushTtok (Sym, arrayTok) ;
          combinedTok := MakeVirtualTok (arrayTok, arrayTok, exprTok) ;
-         BuildAssignment (combinedTok) ;
+         BuildAssignConstant (combinedTok) ;
          PushTFDtok (t, GetDType(t), d, arrayTok) ;
          PushTtok (e, exprTok)
       END
@@ -11981,7 +12042,7 @@ BEGIN
          PopT(e2) ;
          PopT(e1) ;
          PopT(const) ;
-         WriteFormat0('either the constant must be an array constructor or a set constructor but not both') ;
+         WriteFormat0('the constant must be an array constructor or a set constructor but not both') ;
          PushT(const)
       END
    END
diff --git a/gcc/m2/gm2-compiler/P3Build.bnf b/gcc/m2/gm2-compiler/P3Build.bnf
index ec98b49992f..9f5dbb3536d 100644
--- a/gcc/m2/gm2-compiler/P3Build.bnf
+++ b/gcc/m2/gm2-compiler/P3Build.bnf
@@ -87,7 +87,8 @@ FROM M2Quads IMPORT PushT, PopT, PushTF, PopTF, PopNothing, Annotate,
                     BuildSetStart, BuildSetEnd,
                     PushLineNo, BuildSizeCheckStart,
                     BuildBuiltinConst, BuildBuiltinTypeInfo,
-                    BuildAssignment, BuildAlignment,
+                    BuildAssignment, BuildAssignConstant,
+                    BuildAlignment,
                     BuildRepeat, BuildUntil,
                     BuildWhile, BuildDoWhile, BuildEndWhile,
                     BuildLoop, BuildExit, BuildEndLoop,
@@ -662,7 +663,7 @@ ConstantDeclaration :=                                                     % VAR
                                                                            % PushAutoOn %
                        ( Ident "="                                         % tokno := GetTokenNo () -1 %
                                                                            % BuildConst %
-                         ConstExpression )                                 % BuildAssignment (tokno) %
+                         ConstExpression )                                 % BuildAssignConstant (tokno) %
                                                                            % PopAuto %
                      =:
 
@@ -729,12 +730,12 @@ ConstFactor := Number | ConstString | ConstSetOrQualidentOrFunction |
 
 ConstString := string =:
 
-ComponentElement := ConstExpression ( ".." ConstExpression                 % PushT(PeriodPeriodTok) %
+ComponentElement := ConstExpression ( ".." ConstExpression                 % PushTtok(PeriodPeriodTok, GetTokenNo() -1) %
                                       |                                    % PushT(NulTok) %
                                     )
                   =:
 
-ComponentValue := ComponentElement ( 'BY' ConstExpression                  % PushT(ByTok) %
+ComponentValue := ComponentElement ( 'BY' ConstExpression                  % PushTtok(ByTok, GetTokenNo() -1) %
 
                                      |                                     % PushT(NulTok) %
                                    )
diff --git a/gcc/m2/gm2-compiler/PHBuild.bnf b/gcc/m2/gm2-compiler/PHBuild.bnf
index 472fd0ba7a0..9efc005327b 100644
--- a/gcc/m2/gm2-compiler/PHBuild.bnf
+++ b/gcc/m2/gm2-compiler/PHBuild.bnf
@@ -61,7 +61,7 @@ FROM M2Quads IMPORT PushT, PopT, PushTF, PopTF, PopNothing, PushTFtok, PopTFtok,
                     EndBuildInit,
                     BuildProcedureStart,
                     BuildProcedureEnd,
-                    BuildAssignment,
+                    BuildAssignment, BuildAssignConstant,
                     BuildFunctionCall, BuildConstFunctionCall,
                     BuildBinaryOp, BuildUnaryOp, BuildRelOp, BuildNot,
       	       	    BuildEmptySet, BuildInclRange, BuildInclBit,
@@ -612,7 +612,7 @@ ConstantDeclaration :=                                                     % Pus
                                                                            % VAR tokno: CARDINAL ; %
                        ( Ident "="                                         % tokno := GetTokenNo () %
                                                                            % BuildConst %
-                         ConstExpression )                                 % BuildAssignment (tokno) %
+                         ConstExpression )                                 % BuildAssignConstant (tokno) %
                                                                            % PopAuto %
                      =:

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-11-25 15:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-25 15:11 [gcc/devel/modula-2] Bugfix detect assigning constant constructors within a code block Gaius Mulley

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).