[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