[gcc r14-9506] PR modula2/114296 ICE when attempting to create a constant set with a variable element

Gaius Mulley gaius@gcc.gnu.org
Sun Mar 17 14:50:50 GMT 2024


https://gcc.gnu.org/g:f065c582d9c8e0a4fee7ee563c584ee3b1975bea

commit r14-9506-gf065c582d9c8e0a4fee7ee563c584ee3b1975bea
Author: Gaius Mulley <gaiusmod2@gmail.com>
Date:   Sun Mar 17 14:49:23 2024 +0000

    PR modula2/114296 ICE when attempting to create a constant set with a variable element
    
    This patch corrects the virtual token creation for the aggregate constant
    and also corrects tokens for constructor components.
    
    gcc/m2/ChangeLog:
    
            PR modula2/114296
            * gm2-compiler/M2ALU.mod (ElementsSolved): Add tokenno parameter.
            Add constant checks and generate error messages.
            (EvalSetValues): Pass tokenno parameter to ElementsSolved.
            * gm2-compiler/M2LexBuf.mod (stop): New procedure.
            (MakeVirtualTok): Call stop if caret = BadTokenNo.
            * gm2-compiler/M2Quads.def (BuildNulExpression): Add tokpos
            parameter.
            (BuildSetStart): Ditto.
            (BuildEmptySet): Ditto.
            (BuildConstructorEnd): Add startpos parameter.
            (BuildTypeForConstructor): Add tokpos parameter.
            * gm2-compiler/M2Quads.mod (BuildNulExpression): Add tokpos
            parameter and push tokpos to the quad stack.
            (BuildSetStart): Add tokpos parameter and push tokpos.
            (BuildSetEnd): Rewrite.
            (BuildEmptySet): Add tokpos parameter and push tokpos with
            the set type.
            (BuildConstructorStart): Pop typepos.
            (BuildConstructorEnd): Add startpos parameter.
            Create valtok from startpos and cbratokpos.
            (BuildTypeForConstructor): Add tokpos parameter.
            * gm2-compiler/M2Range.def (InitAssignmentRangeCheck): Rename
            d to des and e to expr.
            Add destok and exprtok parameters.
            * gm2-compiler/M2Range.mod (InitAssignmentRangeCheck): Rename
            d to des and e to expr.
            Add destok and exprtok parameters.
            Save destok and exprtok into range record.
            (FoldAssignment): Pass exprtok to TryDeclareConstant.
            * gm2-compiler/P3Build.bnf (ComponentValue): Rewrite.
            (Constructor): Rewrite.
            (ConstSetOrQualidentOrFunction): Rewrite.
            (SetOrQualidentOrFunction): Rewrite.
            * gm2-compiler/PCBuild.bnf (ConstSetOrQualidentOrFunction): Rewrite.
            (SetOrQualidentOrFunction): Rewrite.
            * gm2-compiler/PHBuild.bnf (Constructor): Rewrite.
            (ConstSetOrQualidentOrFunction): Rewrite.
    
    gcc/testsuite/ChangeLog:
    
            PR modula2/114296
            * gm2/pim/fail/badtype2.mod: New test.
    
    Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>

Diff:
---
 gcc/m2/gm2-compiler/M2ALU.mod           |  14 +++-
 gcc/m2/gm2-compiler/M2LexBuf.mod        |  13 +++-
 gcc/m2/gm2-compiler/M2Quads.def         |  15 ++--
 gcc/m2/gm2-compiler/M2Quads.mod         | 124 ++++++++++++++++++--------------
 gcc/m2/gm2-compiler/M2Range.def         |   4 +-
 gcc/m2/gm2-compiler/M2Range.mod         |  14 ++--
 gcc/m2/gm2-compiler/P3Build.bnf         |  48 ++++++++-----
 gcc/m2/gm2-compiler/PCBuild.bnf         |  11 +--
 gcc/m2/gm2-compiler/PHBuild.bnf         |  16 +++--
 gcc/testsuite/gm2/pim/fail/badtype2.mod |   9 +++
 10 files changed, 173 insertions(+), 95 deletions(-)

diff --git a/gcc/m2/gm2-compiler/M2ALU.mod b/gcc/m2/gm2-compiler/M2ALU.mod
index 58d4b5c24ed..cfa372671cd 100644
--- a/gcc/m2/gm2-compiler/M2ALU.mod
+++ b/gcc/m2/gm2-compiler/M2ALU.mod
@@ -2922,10 +2922,20 @@ END AddField ;
    ElementsSolved - returns TRUE if all ranges in the set have been solved.
 *)
 
-PROCEDURE ElementsSolved (r: listOfRange) : BOOLEAN ;
+PROCEDURE ElementsSolved (tokenno: CARDINAL; r: listOfRange) : BOOLEAN ;
 BEGIN
    WHILE r#NIL DO
       WITH r^ DO
+         IF NOT IsConst (low)
+         THEN
+            MetaErrorT1 (tokenno, 'a constant set can only contain constant set elements, {%1Ead} is not a constant',
+                         low)
+         END ;
+         IF (high # low) AND (NOT IsConst (high))
+         THEN
+            MetaErrorT1 (tokenno, 'a constant set can only contain constant set elements, {%1Ead} is not a constant',
+                         high)
+         END ;
          IF NOT (IsSolvedGCC(low) AND IsSolvedGCC(high))
          THEN
             RETURN( FALSE )
@@ -3088,7 +3098,7 @@ END CombineElements ;
 
 PROCEDURE EvalSetValues (tokenno: CARDINAL; r: listOfRange) : BOOLEAN ;
 BEGIN
-   IF ElementsSolved(r)
+   IF ElementsSolved (tokenno, r)
    THEN
       SortElements(tokenno, r) ;
       CombineElements(tokenno, r) ;
diff --git a/gcc/m2/gm2-compiler/M2LexBuf.mod b/gcc/m2/gm2-compiler/M2LexBuf.mod
index 8d9b5a5a6e3..df073630bc1 100644
--- a/gcc/m2/gm2-compiler/M2LexBuf.mod
+++ b/gcc/m2/gm2-compiler/M2LexBuf.mod
@@ -48,6 +48,7 @@ CONST
    Tracing            = FALSE ;
    Debugging          = FALSE ;
    DebugRecover       = FALSE ;
+   BadTokenNo         = 32579 ;
    InitialSourceToken = 2 ;   (* 0 is unknown, 1 is builtin.  *)
 
 TYPE
@@ -81,6 +82,10 @@ VAR
                                     to OpenSource.  *)
 
 
+PROCEDURE stop ;
+END stop ;
+
+
 (*
    InitTokenDesc - returns a TokenDesc filled in with the parameters and
                    the insert field set to NIL.
@@ -1060,10 +1065,14 @@ BEGIN
             AddTokToList (virtualrangetok, NulName, 0,
                           descLeft^.line, descLeft^.col, descLeft^.file,
                           GetLocationBinary (lc, ll, lr)) ;
-            RETURN HighIndice (ListOfTokens)
+            caret := HighIndice (ListOfTokens)
          END
       END
    END ;
+   IF caret = BadTokenNo
+   THEN
+      stop
+   END ;
    RETURN caret
 END MakeVirtualTok ;
 
@@ -1075,7 +1084,7 @@ END MakeVirtualTok ;
 
 PROCEDURE MakeVirtual2Tok (left, right: CARDINAL) : CARDINAL ;
 BEGIN
-   RETURN MakeVirtualTok (left, left, right)
+   RETURN MakeVirtualTok (left, left, right) ;
 END MakeVirtual2Tok ;
 
 
diff --git a/gcc/m2/gm2-compiler/M2Quads.def b/gcc/m2/gm2-compiler/M2Quads.def
index 3e92e3181dc..ad2ee869846 100644
--- a/gcc/m2/gm2-compiler/M2Quads.def
+++ b/gcc/m2/gm2-compiler/M2Quads.def
@@ -1934,9 +1934,10 @@ PROCEDURE BuildDesignatorPointer (ptrtok: CARDINAL) ;
                         Empty             +------------+
                                           | NulSym     |
                                           |------------|
+   tokpos is the position of the RETURN token.
 *)
 
-PROCEDURE BuildNulExpression ;
+PROCEDURE BuildNulExpression (tokpos: CARDINAL) ;
 
 
 (*
@@ -1953,7 +1954,7 @@ PROCEDURE BuildNulExpression ;
                                         |--------------|
 *)
 
-PROCEDURE BuildSetStart ;
+PROCEDURE BuildSetStart (tokpos: CARDINAL) ;
 
 
 (*
@@ -1986,9 +1987,10 @@ PROCEDURE BuildSetEnd ;
       	       	   | SetType   |     | SetType     |
                    |-----------|     |-------------|
 
+   tokpos points to the opening '{'.
 *)
 
-PROCEDURE BuildEmptySet ;
+PROCEDURE BuildEmptySet (tokpos: CARDINAL) ;
 
 
 (*
@@ -2097,9 +2099,12 @@ PROCEDURE BuildConstructorStart (cbratokpos: CARDINAL) ;
                          +------------+        +------------+
                          | const      |        | const      |
                          |------------+        |------------|
+
+   startpos is the start of the constructor, either the typename or '{'
+   cbratokpos is the '}'.
 *)
 
-PROCEDURE BuildConstructorEnd (cbratokpos: CARDINAL) ;
+PROCEDURE BuildConstructorEnd (startpos, cbratokpos: CARDINAL) ;
 
 
 (*
@@ -2116,7 +2121,7 @@ PROCEDURE NextConstructorField ;
                              it Pushes a Bitset type.
 *)
 
-PROCEDURE BuildTypeForConstructor ;
+PROCEDURE BuildTypeForConstructor (tokpos: CARDINAL) ;
 
 
 (*
diff --git a/gcc/m2/gm2-compiler/M2Quads.mod b/gcc/m2/gm2-compiler/M2Quads.mod
index 1776a09b41f..0558c782101 100644
--- a/gcc/m2/gm2-compiler/M2Quads.mod
+++ b/gcc/m2/gm2-compiler/M2Quads.mod
@@ -147,7 +147,7 @@ FROM M2Comp IMPORT CompilingImplementationModule,
                    CompilingProgramModule ;
 
 FROM M2LexBuf IMPORT currenttoken, UnknownTokenNo, BuiltinTokenNo,
-                     GetToken, MakeVirtualTok,
+                     GetToken, MakeVirtualTok, MakeVirtual2Tok,
                      GetFileName, TokenToLineNo, GetTokenName,
                      GetTokenNo, GetLineNo, GetPreviousTokenLineNo, PrintTokenNo ;
 
@@ -3702,7 +3702,7 @@ BEGIN
       THEN
          (* Tell code generator to test runtime values of assignment so ensure we
             catch overflow and underflow.  *)
-         BuildRange (InitAssignmentRangeCheck (combinedtok, Des, Exp))
+         BuildRange (InitAssignmentRangeCheck (combinedtok, Des, Exp, destok, exptok))
       END ;
       IF checkTypes
       THEN
@@ -11825,11 +11825,12 @@ END BuildAccessWithField ;
                         Empty             +------------+
                                           | NulSym     |
                                           |------------|
+   tokpos is the position of the RETURN token.
 *)
 
-PROCEDURE BuildNulExpression ;
+PROCEDURE BuildNulExpression (tokpos: CARDINAL) ;
 BEGIN
-   PushT(NulSym)
+   PushTtok (NulSym, tokpos)
 END BuildNulExpression ;
 
 
@@ -11839,25 +11840,25 @@ END BuildNulExpression ;
                              it Pushes a Bitset type.
 *)
 
-PROCEDURE BuildTypeForConstructor ;
+PROCEDURE BuildTypeForConstructor (tokpos: CARDINAL) ;
 VAR
    c: ConstructorFrame ;
 BEGIN
    IF NoOfItemsInStackAddress(ConstructorStack)=0
    THEN
-      PushT(Bitset)
+      PushTtok (Bitset, tokpos)
    ELSE
       c := PeepAddress(ConstructorStack, 1) ;
       WITH c^ DO
-         IF IsArray(type) OR IsSet(type)
+         IF IsArray (type) OR IsSet (type)
          THEN
-            PushT(GetSType(type))
-         ELSIF IsRecord(type)
+            PushTtok (GetSType (type), tokpos)
+         ELSIF IsRecord (type)
          THEN
-            PushT(GetSType(GetNth(type, index)))
+            PushTtok (GetSType (GetNth (type, index)), tokpos)
          ELSE
-            MetaError1('{%1ad} is not a set, record or array type which is expected when constructing an aggregate entity',
-                       type)
+            MetaError1 ('{%1ad} is not a set, record or array type which is expected when constructing an aggregate entity',
+                        type)
          END
       END
    END
@@ -11878,9 +11879,9 @@ END BuildTypeForConstructor ;
                                         |--------------|
 *)
 
-PROCEDURE BuildSetStart ;
+PROCEDURE BuildSetStart (tokpos: CARDINAL) ;
 BEGIN
-   PushT(Bitset)
+   PushTtok (Bitset, tokpos)
 END BuildSetStart ;
 
 
@@ -11900,12 +11901,15 @@ END BuildSetStart ;
 
 PROCEDURE BuildSetEnd ;
 VAR
-   v, t: CARDINAL ;
+   valuepos, typepos,
+   combined,
+   value, type      : CARDINAL ;
 BEGIN
-   PopT(v) ;
-   PopT(t) ;
-   PushTF(v, t) ;
-   Assert(IsSet(t))
+   PopTtok (value, valuepos) ;
+   PopTtok (type, typepos) ;
+   combined := MakeVirtual2Tok (typepos, valuepos) ;
+   PushTFtok (value, type, combined) ;
+   Assert (IsSet (type))
 END BuildSetEnd ;
 
 
@@ -11922,52 +11926,54 @@ END BuildSetEnd ;
       	       	   | SetType   |     | SetType     |
                    |-----------|     |-------------|
 
+   tokpos points to the opening '{'.
 *)
 
-PROCEDURE BuildEmptySet ;
+PROCEDURE BuildEmptySet (tokpos: CARDINAL) ;
 VAR
-   n     : Name ;
-   Type  : CARDINAL ;
-   NulSet: CARDINAL ;
-   tok   : CARDINAL ;
+   n      : Name ;
+   typepos,
+   Type   : CARDINAL ;
+   NulSet : CARDINAL ;
+   tok    : CARDINAL ;
 BEGIN
-   PopT(Type) ;  (* type of set we are building *)
-   tok := GetTokenNo () ;
-   IF (Type=NulSym) AND Pim
+   PopTtok (Type, typepos) ;  (* type of set we are building *)
+   IF (Type = NulSym) AND Pim
    THEN
       (* allowed generic {} in PIM Modula-2 *)
-   ELSIF IsUnknown(Type)
+      typepos := tokpos
+   ELSIF IsUnknown (Type)
    THEN
-      n := GetSymName(Type) ;
-      WriteFormat1('set type %a is undefined', n) ;
+      n := GetSymName (Type) ;
+      WriteFormat1 ('set type %a is undefined', n) ;
       Type := Bitset
-   ELSIF NOT IsSet(SkipType(Type))
+   ELSIF NOT IsSet (SkipType (Type))
    THEN
-      n := GetSymName(Type) ;
+      n := GetSymName (Type) ;
       WriteFormat1('expecting a set type %a', n) ;
       Type := Bitset
    ELSE
-      Type := SkipType(Type) ;
-      Assert((Type#NulSym))
+      Type := SkipType (Type) ;
+      Assert (Type # NulSym)
    END ;
-   NulSet := MakeTemporary(tok, ImmediateValue) ;
-   PutVar(NulSet, Type) ;
-   PutConstSet(NulSet) ;
+   NulSet := MakeTemporary (typepos, ImmediateValue) ;
+   PutVar (NulSet, Type) ;
+   PutConstSet (NulSet) ;
    IF CompilerDebugging
    THEN
-      n := GetSymName(Type) ;
-      printf1('set type = %a\n', n)
+      n := GetSymName (Type) ;
+      printf1 ('set type = %a\n', n)
    END ;
-   PushNulSet(Type) ;   (* onto the ALU stack  *)
-   PopValue(NulSet) ;   (* ALU -> symbol table *)
+   PushNulSet (Type) ;   (* onto the ALU stack  *)
+   PopValue (NulSet) ;   (* ALU -> symbol table *)
 
    (* and now construct the M2Quads stack as defined by the comments above *)
-   PushT(Type) ;
-   PushT(NulSet) ;
+   PushTtok (Type, typepos) ;
+   PushTtok (NulSet, typepos) ;
    IF CompilerDebugging
    THEN
-      n := GetSymName(Type) ;
-      printf2('Type = %a  (%d)  built empty set\n', n, Type) ;
+      n := GetSymName (Type) ;
+      printf2 ('Type = %a  (%d)  built empty set\n', n, Type) ;
       DisplayStack    (* Debugging info *)
    END
 END BuildEmptySet ;
@@ -12197,10 +12203,11 @@ END SilentBuildConstructorStart ;
 
 PROCEDURE BuildConstructorStart (cbratokpos: CARDINAL) ;
 VAR
+   typepos,
    constValue,
    type      : CARDINAL ;
 BEGIN
-   PopT (type) ;   (* we ignore the type as we already have the constructor symbol from pass C *)
+   PopTtok (type, typepos) ;   (* we ignore the type as we already have the constructor symbol from pass C *)
    GetConstructorFromFifoQueue (constValue) ;
    IF type # GetSType (constValue)
    THEN
@@ -12224,25 +12231,34 @@ END BuildConstructorStart ;
                          +------------+        +------------+
                          | const      |        | const      |
                          |------------|        |------------|
+
+   startpos is the start of the constructor, either the typename or '{'
+   cbratokpos is the '}'.
 *)
 
-PROCEDURE BuildConstructorEnd (cbratokpos: CARDINAL) ;
+PROCEDURE BuildConstructorEnd (startpos, cbratokpos: CARDINAL) ;
 VAR
    typetok,
    value, valtok: CARDINAL ;
 BEGIN
+   IF DebugTokPos
+   THEN
+      WarnStringAt (InitString ('startpos'), startpos) ;
+      WarnStringAt (InitString ('cbratokpos'), cbratokpos)
+   END ;
    PopTtok (value, valtok) ;
-   IF IsBoolean (1)
+   IF DebugTokPos
    THEN
-      typetok := valtok
-   ELSE
-      typetok := OperandTtok (1)
+      WarnStringAt (InitString ('value valtok'), valtok)
    END ;
-   valtok := MakeVirtualTok (typetok, typetok, cbratokpos) ;
+   valtok := MakeVirtual2Tok (startpos, cbratokpos) ;
    PutDeclared (valtok, value) ;
    PushTtok (value, valtok) ;   (* Use valtok as we now know it was a constructor.  *)
-   PopConstructor
-   (* ; ErrorStringAt (Mark (InitString ('aggregate constant')), valtok) *)
+   PopConstructor ;
+   IF DebugTokPos
+   THEN
+      WarnStringAt (InitString ('aggregate constant'), valtok)
+   END
 END BuildConstructorEnd ;
 
 
diff --git a/gcc/m2/gm2-compiler/M2Range.def b/gcc/m2/gm2-compiler/M2Range.def
index 2ffd74f2c37..f8c21156674 100644
--- a/gcc/m2/gm2-compiler/M2Range.def
+++ b/gcc/m2/gm2-compiler/M2Range.def
@@ -51,7 +51,9 @@ FROM DynamicStrings IMPORT String ;
                               can be generated later on.
 *)
 
-PROCEDURE InitAssignmentRangeCheck (tokno: CARDINAL; d, e: CARDINAL) : CARDINAL ;
+PROCEDURE InitAssignmentRangeCheck (tokno: CARDINAL;
+                                    des, expr: CARDINAL;
+                                    destok, exprtok: CARDINAL) : CARDINAL ;
 
 
 (*
diff --git a/gcc/m2/gm2-compiler/M2Range.mod b/gcc/m2/gm2-compiler/M2Range.mod
index 654ac046c6f..50c2a48fe7f 100644
--- a/gcc/m2/gm2-compiler/M2Range.mod
+++ b/gcc/m2/gm2-compiler/M2Range.mod
@@ -601,16 +601,22 @@ END PutRangeArraySubscript ;
 (*
    InitAssignmentRangeCheck - returns a range check node which
                               remembers the information necessary
-                              so that a range check for d := e
+                              so that a range check for des := expr
                               can be generated later on.
 *)
 
-PROCEDURE InitAssignmentRangeCheck (tokno: CARDINAL; d, e: CARDINAL) : CARDINAL ;
+PROCEDURE InitAssignmentRangeCheck (tokno: CARDINAL;
+                                    des, expr: CARDINAL;
+                                    destok, exprtok: CARDINAL) : CARDINAL ;
 VAR
    r: CARDINAL ;
+   p: Range ;
 BEGIN
    r := InitRange () ;
-   Assert (PutRange (tokno, GetIndice (RangeIndex, r), assignment, d, e) # NIL) ;
+   p := GetIndice (RangeIndex, r) ;
+   Assert (PutRange (tokno, p, assignment, des, expr) # NIL) ;
+   p^.destok := destok ;
+   p^.exprtok := exprtok ;
    RETURN r
 END InitAssignmentRangeCheck ;
 
@@ -1207,7 +1213,7 @@ VAR
 BEGIN
    p := GetIndice (RangeIndex, r) ;
    WITH p^ DO
-      TryDeclareConstant (tokenNo, expr) ;
+      TryDeclareConstant (exprtok, expr) ;
       IF desLowestType # NulSym
       THEN
          IF AssignmentTypeCompatible (tokenno, "", des, expr)
diff --git a/gcc/m2/gm2-compiler/P3Build.bnf b/gcc/m2/gm2-compiler/P3Build.bnf
index 3c9b9534647..cc1accef1a0 100644
--- a/gcc/m2/gm2-compiler/P3Build.bnf
+++ b/gcc/m2/gm2-compiler/P3Build.bnf
@@ -739,10 +739,15 @@ ComponentElement := ConstExpression ( ".." ConstExpression                 % Pus
                                     )
                   =:
 
-ComponentValue := ComponentElement ( 'BY' ConstExpression                  % PushTtok(ByTok, GetTokenNo() -1) %
+ComponentValue :=                                                          % VAR tokpos: CARDINAL ; %
+                  (
+                                                                           % tokpos := GetTokenNo () %
+                    ComponentElement (                                     % tokpos := GetTokenNo () %
+                                       'BY' ConstExpression                % PushTtok (ByTok, tokpos) %
 
-                                     |                                     % PushT(NulTok) %
-                                   )
+                                       |                                   % PushTtok (NulTok, tokpos) %
+                                     )
+                  )
                 =:
 
 ArraySetRecordValue := ComponentValue                                      % BuildComponentValue %
@@ -751,16 +756,22 @@ ArraySetRecordValue := ComponentValue                                      % Bui
                                                            }
                      =:
 
-Constructor :=                                                             % DisplayStack %
-               '{'                                                         % BuildConstructorStart (GetTokenNo() -1) %
-                  [ ArraySetRecordValue ]                                  % BuildConstructorEnd (GetTokenNo())  %
+Constructor :=                                                             % VAR tokpos: CARDINAL ; %
+                                                                           % DisplayStack %
+               '{'                                                         % tokpos := GetTokenNo () -1 %
+                                                                           % BuildConstructorStart (tokpos) %
+                  [ ArraySetRecordValue ]                                  % BuildConstructorEnd (tokpos, GetTokenNo())  %
                '}' =:
 
-ConstSetOrQualidentOrFunction := Qualident
-                                 [ Constructor | ConstActualParameters     % BuildConstFunctionCall %
-                                                                       ]
-                                   |                                       % BuildTypeForConstructor %
-                                     Constructor =:
+ConstSetOrQualidentOrFunction :=                                           % VAR tokpos: CARDINAL ; %
+                                                                           % tokpos := GetTokenNo () %
+                                 (
+                                   Qualident
+                                     [ Constructor | ConstActualParameters % BuildConstFunctionCall %
+                                                                         ]
+                                   |                                       % BuildTypeForConstructor (tokpos) %
+                                     Constructor
+                                 ) =:
 
 ConstActualParameters :=                                                   % PushInConstExpression %
                          ActualParameters                                  % PopInConstExpression %
@@ -1101,10 +1112,13 @@ Factor :=                                                                  % VAR
           | ConstAttribute
                                 ) =:
 
-SetOrDesignatorOrFunction := Qualident
-                                                                           % Assert (OperandTok(1) # UnknownTokenNo) %
+SetOrDesignatorOrFunction :=                                               % VAR tokpos: CARDINAL ; %
+                                                                           % tokpos := GetTokenNo () %
+                             (
+                               Qualident
+                                                                           % Assert (OperandTok (1) # UnknownTokenNo) %
                                                                            % CheckWithReference %
-                                                                           % Assert (OperandTok(1) # UnknownTokenNo) %
+                                                                           % Assert (OperandTok (1) # UnknownTokenNo) %
                               [ Constructor |
                                 SimpleDes                                  % (* Assert (OperandTok(1) # UnknownTokenNo) *) %
                                           [ ActualParameters               % IF IsInConstExpression()
@@ -1115,8 +1129,8 @@ SetOrDesignatorOrFunction := Qualident
                                                                              END %
                                                              ]
                               ]                                |
-                                                                           % BuildTypeForConstructor %
-                              Constructor =:
+                                                                           % BuildTypeForConstructor (tokpos) %
+                              Constructor ) =:
 
 -- SimpleDes := { "." Ident | "[" ExpList "]" | "^" } =:
 SimpleDes := { SubDesignator } =:
@@ -1130,7 +1144,7 @@ ExitStatement := "EXIT"                                                    % Bui
 
 ReturnStatement := "RETURN"                                                % VAR tokno: CARDINAL ; %
                                                                            % tokno := GetTokenNo () -1 %
-                            ( Expression |                                 % BuildNulExpression (* in epsilon *) %
+                            ( Expression |                                 % BuildNulExpression (tokno) %
                                            )                               % BuildReturn (tokno) %
                 =:
 
diff --git a/gcc/m2/gm2-compiler/PCBuild.bnf b/gcc/m2/gm2-compiler/PCBuild.bnf
index 2297663ef27..4034dda245a 100644
--- a/gcc/m2/gm2-compiler/PCBuild.bnf
+++ b/gcc/m2/gm2-compiler/PCBuild.bnf
@@ -700,12 +700,13 @@ ConstructorOrConstActualParameters := Constructor | ConstActualParameters  % Pus
 -- the entry to Constructor
 
 ConstSetOrQualidentOrFunction :=                                           % PushAutoOff %
-                                 (
+                                                                           % VAR tokpos: CARDINAL ; %
+                                 (                                         % tokpos := GetTokenNo () %
                                    PushQualident
                                    ( ConstructorOrConstActualParameters |  % PushConstType %
                                                                            % PopNothing %
                                                                           )
-                                   |                                       % BuildTypeForConstructor %
+                                   |                                       % BuildTypeForConstructor (tokpos) %
                                      Constructor )                         % PopAuto %
                                =:
 
@@ -1003,12 +1004,14 @@ ConstructorOrSimpleDes := Constructor |                                    % Pop
                         =:
 
 SetOrDesignatorOrFunction :=                                              % PushAutoOff %
-                             (
+                                                                          % VAR tokpos: CARDINAL ; %
+
+                             (                                            % tokpos := GetTokenNo () %
                                PushQualident
                                ( ConstructorOrSimpleDes |                 % PopNothing %
                                                           )
                                 |
-                                                                          % BuildTypeForConstructor %
+                                                                          % BuildTypeForConstructor (tokpos) %
                                   Constructor
                              )                                            % PopAuto %
                           =:
diff --git a/gcc/m2/gm2-compiler/PHBuild.bnf b/gcc/m2/gm2-compiler/PHBuild.bnf
index 89e756d4f87..fcb1ce6092a 100644
--- a/gcc/m2/gm2-compiler/PHBuild.bnf
+++ b/gcc/m2/gm2-compiler/PHBuild.bnf
@@ -652,19 +652,23 @@ ArraySetRecordValue := ComponentValue                                      % Bui
                                                            }
                      =:
 
-Constructor := '{'                                                         % BuildConstructorStart (GetTokenNo() -1) %
-                  [ ArraySetRecordValue ]                                  % BuildConstructorEnd (GetTokenNo())  %
+Constructor :=                                                             % VAR tokpos: CARDINAL ; %
+                                                                           % DisplayStack %
+               '{'                                                         % tokpos := GetTokenNo () -1 %
+                                                                           % BuildConstructorStart (tokpos) %
+                  [ ArraySetRecordValue ]                                  % BuildConstructorEnd (tokpos, GetTokenNo())  %
                '}' =:
 
-ConstSetOrQualidentOrFunction :=                                            % PushAutoOn %
-                                 (
+ConstSetOrQualidentOrFunction :=                                           % PushAutoOn %
+                                                                           % VAR tokpos: CARDINAL ; %
+                                 (                                         % tokpos := GetTokenNo () %
                                     Qualident
                                     [ Constructor |
                                        ConstActualParameters               % BuildConstFunctionCall %
                                                                           ]
-                                      |                                    % BuildTypeForConstructor %
+                                      |                                    % BuildTypeForConstructor (tokpos) %
                                         Constructor
-                                 )                                          % PopAuto %
+                                 )                                         % PopAuto %
                                 =:
 
 ConstAttribute := "__ATTRIBUTE__" "__BUILTIN__" "(" "(" ConstAttributeExpression ")" ")" =:
diff --git a/gcc/testsuite/gm2/pim/fail/badtype2.mod b/gcc/testsuite/gm2/pim/fail/badtype2.mod
new file mode 100644
index 00000000000..ee3e9265190
--- /dev/null
+++ b/gcc/testsuite/gm2/pim/fail/badtype2.mod
@@ -0,0 +1,9 @@
+MODULE badtype2 ;
+
+VAR
+   x: CARDINAL ;
+   ch: CHAR ;
+BEGIN
+   x := 6 ;
+   ch := {7 .. x};
+END badtype2.


More information about the Gcc-cvs mailing list