PR modula2/122241: Lack of spellng hints with simple errors

Following on from the initial bug fix for PR modula2/122241
this patch provides spell check hints for unknown types, variables
and constants.  The accuracy of the offending module end name
is also improved

gcc/m2/ChangeLog:

	PR modula2/122241
	* gm2-compiler/M2Quads.mod (BuildSizeFunction): Improve
	error message.
	(BuildTSizeFunction): Improve error message.
	* gm2-compiler/P3Build.bnf (ProgramModule): New variable
	namet.
	Pass namet to P3EndBuildProgModule.
	(ImplementationModule): New variable namet.
	Pass namet to P3EndBuildImpModule.
	(ModuleDeclaration): New variable namet.
	Pass namet to P3EndBuildInnerModule.
	(DefinitionModule): New variable namet.
	Pass namet to P3EndBuildDefModule.
	* gm2-compiler/P3SymBuild.def (P3EndBuildDefModule): New
	parameter tokno.
	(P3EndBuildImpModule): Ditto.
	(P3EndBuildProgModule): Ditto.
	(EndBuildInnerModule): Ditto.
	* gm2-compiler/P3SymBuild.mod (P3EndBuildDefModule): New
	parameter tokno.
	Pass tokno to CheckForUnknownInModule.
	(P3EndBuildImpModule): Ditto.
	(P3EndBuildProgModule): Ditto.
	(EndBuildInnerModule): Ditto.
	* gm2-compiler/PCBuild.bnf (ProgramModule): New variable
	namet.
	Pass namet to PCEndBuildProgModule.
	(ImplementationModule): New variable namet.
	Pass namet to PCEndBuildImpModule.
	(ModuleDeclaration): New variable namet.
	Pass namet to PCEndBuildInnerModule.
	(DefinitionModule): New variable namet.
	Pass namet to PCEndBuildDefModule.
	* gm2-compiler/PCSymBuild.def (PCEndBuildDefModule): New
	parameter tokno.
	(PCEndBuildImpModule): Ditto.
	(PCEndBuildProgModule):	Ditto.
	(PCEndBuildInnerModule): Ditto.
	* gm2-compiler/PCSymBuild.mod (PCEndBuildDefModule): New
	parameter tokno.
	Pass tokno to CheckForUnknownInModule.
	(PCEndBuildImpModule): Ditto.
	(PCEndBuildProgModule): Ditto.
	(PCEndBuildInnerModule): Ditto.
	* gm2-compiler/PHBuild.bnf (DefinitionModule): New variable
	namet.
	Pass namet to PHEndBuildDefModule.
	(ModuleDeclaration): New variable namet.
	Pass namet to PHEndBuildProgModule.
	(ImplementationModule): New variable namet.
	Pass namet to PHEndBuildImpModule.
	(ModuleDeclaration): New variable namet.
	Pass namet to PHEndBuildInnerModule.
	(DefinitionModule): New variable namet.
	Pass namet to PHEndBuildDefModule.
	* gm2-compiler/SymbolTable.def (CheckForUnknownInModule): Add
	tokno parameter.
	* gm2-compiler/SymbolTable.mod (CheckForUnknownInModule): Add
	tokno parameter.
	Pass tokno to CheckForUnknowns.
	(CheckForUnknowns): Reimplement.

gcc/testsuite/ChangeLog:

	PR modula2/122241
	* gm2/iso/fail/badconst.mod: New test.
	* gm2/iso/fail/badtype.mod: New test.
	* gm2/iso/fail/badvar.mod: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
This commit is contained in:
Gaius Mulley 2025-10-13 16:43:07 +01:00
parent 0c670d3845
commit 65acf3665e
13 changed files with 120 additions and 76 deletions

View File

@ -10712,7 +10712,7 @@ BEGIN
ELSE
resulttok := functok ;
MetaErrorT1 (resulttok,
'{%E}SYSTEM procedure {%kSIZE} expects a variable as its parameter, seen {%1Ed}',
'{%E}SYSTEM procedure {%kSIZE} expects a variable or type as its parameter, seen {%1Ed}',
OperandT (1)) ;
ReturnVar := MakeConstLit (resulttok, MakeKey('0'), Cardinal)
END ;
@ -10777,7 +10777,7 @@ BEGIN
GenQuadO (resulttok, SizeOp, ReturnVar, NulSym, GetSType (OperandT (1)), FALSE)
ELSE
MetaErrorT1 (resulttok,
'{%E}SYSTEM procedure function {%kTSIZE} expects a variable as its first parameter, seen {%1Ed}',
'{%E}SYSTEM procedure function {%kTSIZE} expects a variable or type as its first parameter, seen {%1Ed}',
OperandT (1)) ;
ReturnVar := MakeConstLit (resulttok, MakeKey ('0'), Cardinal)
END

View File

@ -655,7 +655,7 @@ FileUnit := % Pus
ImplementationOrProgramModule ) % PopAuto %
=:
ProgramModule := % VAR modulet, endt: CARDINAL ; %
ProgramModule := % VAR modulet, endt, namet: CARDINAL ; %
% modulet := GetTokenNo () %
"MODULE" % M2Error.DefaultProgramModule %
% PushAutoOn %
@ -670,12 +670,13 @@ ProgramModule := % VAR
{ Import }
Block % PushAutoOn %
% endt := GetTokenNo () -1 %
% namet := GetTokenNo () %
Ident % EndBuildFile (endt) %
% P3EndBuildProgModule %
% P3EndBuildProgModule (namet) %
"." % PopAuto ; PopAuto %
=:
ImplementationModule := % VAR modulet, endt: CARDINAL ; %
ImplementationModule := % VAR modulet, endt, namet: CARDINAL ; %
% modulet := GetTokenNo () %
"IMPLEMENTATION" % M2Error.DefaultImplementationModule %
"MODULE" % PushAutoOn %
@ -689,8 +690,9 @@ ImplementationModule := % VAR
{ Import }
Block % PushAutoOn %
% endt := GetTokenNo () -1 %
% namet := GetTokenNo () %
Ident % EndBuildFile (endt) %
% P3EndBuildImpModule %
% P3EndBuildImpModule (namet) %
"." % PopAuto ; PopAuto ; PopAuto %
=:
@ -1503,7 +1505,7 @@ DefOptArg := "[" Ident ":" FormalType "=" ConstExpression % Bui
FormalType := { "ARRAY" "OF" } QualidentCheck =:
ModuleDeclaration := % VAR modulet: CARDINAL ; %
ModuleDeclaration := % VAR modulet, namet: CARDINAL ; %
% modulet := GetTokenNo () %
"MODULE" % M2Error.DefaultInnerModule %
% PushAutoOn %
@ -1513,7 +1515,8 @@ ModuleDeclaration := % VAR
[ Priority ] ";"
{ Import } [ Export ]
Block % PushAutoOn %
Ident % EndBuildInnerModule %
% namet := GetTokenNo () %
Ident % EndBuildInnerModule (namet) %
% PopAuto ; PopAuto ; PopAuto %
=:
@ -1540,7 +1543,7 @@ WithoutFromImport := % Pus
Import := FromImport | WithoutFromImport =:
DefinitionModule := % VAR deft, endt: CARDINAL ; %
DefinitionModule := % VAR deft, endt, namet: CARDINAL ; %
% deft := GetTokenNo () %
"DEFINITION" % M2Error.DefaultDefinitionModule %
"MODULE" % PushAutoOn %
@ -1553,8 +1556,9 @@ DefinitionModule := % VAR
]
{ Definition } % endt := GetTokenNo () %
"END" % PushAutoOn %
% namet := GetTokenNo () %
Ident % EndBuildFile (endt) ;
P3EndBuildDefModule %
P3EndBuildDefModule (namet) %
"." % PopAuto ; PopAuto ; PopAuto %
=:

View File

@ -64,7 +64,7 @@ PROCEDURE P3StartBuildDefModule ;
|------------| |-----------|
*)
PROCEDURE P3EndBuildDefModule ;
PROCEDURE P3EndBuildDefModule (tokno: CARDINAL) ;
(*
@ -101,7 +101,7 @@ PROCEDURE P3StartBuildImpModule ;
|------------| |-----------|
*)
PROCEDURE P3EndBuildImpModule ;
PROCEDURE P3EndBuildImpModule (tokno: CARDINAL) ;
(*
@ -138,7 +138,7 @@ PROCEDURE P3StartBuildProgModule ;
|------------| |-----------|
*)
PROCEDURE P3EndBuildProgModule ;
PROCEDURE P3EndBuildProgModule (tokno: CARDINAL) ;
(*
@ -182,7 +182,7 @@ PROCEDURE StartBuildInnerModule ;
|------------| |-----------|
*)
PROCEDURE EndBuildInnerModule ;
PROCEDURE EndBuildInnerModule (tokno: CARDINAL) ;
(*

View File

@ -117,13 +117,13 @@ END P3StartBuildDefModule ;
|------------| |-----------|
*)
PROCEDURE P3EndBuildDefModule ;
PROCEDURE P3EndBuildDefModule (tokno: CARDINAL) ;
VAR
NameStart,
NameEnd : CARDINAL ;
BEGIN
Assert(CompilingDefinitionModule()) ;
CheckForUnknownInModule ;
CheckForUnknownInModule (tokno) ;
EndScope ;
M2StackSpell.Pop ;
PopT(NameEnd) ;
@ -187,13 +187,13 @@ END P3StartBuildImpModule ;
|------------| |-----------|
*)
PROCEDURE P3EndBuildImpModule ;
PROCEDURE P3EndBuildImpModule (tokno: CARDINAL) ;
VAR
NameStart,
NameEnd : Name ;
BEGIN
Assert(CompilingImplementationModule()) ;
CheckForUnknownInModule ;
CheckForUnknownInModule (tokno) ;
EndScope ;
M2StackSpell.Pop ;
PopT(NameEnd) ;
@ -262,13 +262,13 @@ END P3StartBuildProgModule ;
|------------| |-----------|
*)
PROCEDURE P3EndBuildProgModule ;
PROCEDURE P3EndBuildProgModule (tokno: CARDINAL) ;
VAR
NameStart,
NameEnd : Name ;
BEGIN
Assert(CompilingProgramModule()) ;
CheckForUnknownInModule ;
CheckForUnknownInModule (tokno) ;
EndScope ;
PopT(NameEnd) ;
PopT(NameStart) ;
@ -334,12 +334,12 @@ END StartBuildInnerModule ;
|------------| |-----------|
*)
PROCEDURE EndBuildInnerModule ;
PROCEDURE EndBuildInnerModule (tokno: CARDINAL) ;
VAR
NameStart,
NameEnd : Name ;
BEGIN
CheckForUnknownInModule ;
CheckForUnknownInModule (tokno) ;
EndScope ;
PopT(NameEnd) ;
PopT(NameStart) ;

View File

@ -598,7 +598,8 @@ FileUnit := % Pus
ImplementationOrProgramModule ) % PopAuto %
=:
ProgramModule := "MODULE" % M2Error.DefaultProgramModule %
ProgramModule := "MODULE" % VAR namet: CARDINAL ; %
% M2Error.DefaultProgramModule %
% PushAutoOn %
Ident % PCStartBuildProgModule %
% PushAutoOff %
@ -608,11 +609,13 @@ ProgramModule := "MODULE" % M2E
{ Import % PCBuildImportOuterModule %
}
Block % PushAutoOn %
Ident % PCEndBuildProgModule %
% namet := GetTokenNo () %
Ident % PCEndBuildProgModule (namet) %
"." % PopAuto ; PopAuto %
=:
ImplementationModule := "IMPLEMENTATION" % M2Error.DefaultImplementationModule %
ImplementationModule := "IMPLEMENTATION" % VAR namet: CARDINAL ; %
% M2Error.DefaultImplementationModule %
"MODULE" % PushAutoOn %
Ident % PCStartBuildImpModule %
% PushAutoOff %
@ -621,8 +624,8 @@ ImplementationModule := "IMPLEMENTATION" % M2E
{ Import % PCBuildImportOuterModule %
}
Block % PushAutoOn %
Ident % PCEndBuildImpModule %
% namet := GetTokenNo () %
Ident % PCEndBuildImpModule (namet) %
"." % PopAuto ; PopAuto ; PopAuto %
=:
@ -1271,7 +1274,8 @@ DefOptArg := "[" Ident ":" FormalType "=" ConstExpression "]" =:
FormalType := { "ARRAY" "OF" } Qualident =:
ModuleDeclaration := "MODULE" % M2Error.DefaultInnerModule %
ModuleDeclaration := "MODULE" % VAR namet: CARDINAL ; %
% M2Error.DefaultInnerModule %
% PushAutoOn %
Ident % PCStartBuildInnerModule %
% PushAutoOff %
@ -1280,7 +1284,8 @@ ModuleDeclaration := "MODULE" % M2E
} [ Export
]
Block % PushAutoOn %
Ident % PCEndBuildInnerModule %
% namet := GetTokenNo () %
Ident % PCEndBuildInnerModule (namet) %
% PopAuto ; PopAuto ; PopAuto %
=:
@ -1299,7 +1304,8 @@ Import := % Pus
IdentList ";" ) % PopAuto %
=:
DefinitionModule := "DEFINITION" % M2Error.DefaultDefinitionModule %
DefinitionModule := "DEFINITION" % VAR namet: CARDINAL ; %
% M2Error.DefaultDefinitionModule %
"MODULE" % PushAutoOn %
[ "FOR" string ]
Ident % PCStartBuildDefModule ;
@ -1310,7 +1316,8 @@ DefinitionModule := "DEFINITION" % M2E
]
{ Definition }
"END" % PushAutoOn %
Ident % PCEndBuildDefModule %
% namet := GetTokenNo () %
Ident % PCEndBuildDefModule (namet) %
"." % PopAuto ; PopAuto ; PopAuto %
=:

View File

@ -71,7 +71,7 @@ PROCEDURE PCStartBuildDefModule ;
|------------| |-----------|
*)
PROCEDURE PCEndBuildDefModule ;
PROCEDURE PCEndBuildDefModule (tokno: CARDINAL) ;
(*
@ -108,7 +108,7 @@ PROCEDURE PCStartBuildImpModule ;
|------------| |-----------|
*)
PROCEDURE PCEndBuildImpModule ;
PROCEDURE PCEndBuildImpModule (tokno: CARDINAL) ;
(*
@ -145,7 +145,7 @@ PROCEDURE PCStartBuildProgModule ;
|------------| |-----------|
*)
PROCEDURE PCEndBuildProgModule ;
PROCEDURE PCEndBuildProgModule (tokno: CARDINAL) ;
(*
@ -182,7 +182,7 @@ PROCEDURE PCStartBuildInnerModule ;
|------------| |-----------|
*)
PROCEDURE PCEndBuildInnerModule ;
PROCEDURE PCEndBuildInnerModule (tokno: CARDINAL) ;
(*

View File

@ -257,13 +257,13 @@ END PCStartBuildDefModule ;
|------------| |-----------|
*)
PROCEDURE PCEndBuildDefModule ;
PROCEDURE PCEndBuildDefModule (tokno: CARDINAL) ;
VAR
NameStart,
NameEnd : CARDINAL ;
BEGIN
Assert(CompilingDefinitionModule()) ;
CheckForUnknownInModule ;
CheckForUnknownInModule (tokno) ;
EndScope ;
PopT(NameEnd) ;
PopT(NameStart) ;
@ -325,13 +325,13 @@ END PCStartBuildImpModule ;
|------------| |-----------|
*)
PROCEDURE PCEndBuildImpModule ;
PROCEDURE PCEndBuildImpModule (tokno: CARDINAL) ;
VAR
NameStart,
NameEnd : Name ;
BEGIN
Assert(CompilingImplementationModule()) ;
CheckForUnknownInModule ;
CheckForUnknownInModule (tokno) ;
EndScope ;
PopT(NameEnd) ;
PopT(NameStart) ;
@ -398,13 +398,13 @@ END PCStartBuildProgModule ;
|------------| |-----------|
*)
PROCEDURE PCEndBuildProgModule ;
PROCEDURE PCEndBuildProgModule (tokno: CARDINAL) ;
VAR
NameStart,
NameEnd : Name ;
BEGIN
Assert(CompilingProgramModule()) ;
CheckForUnknownInModule ;
CheckForUnknownInModule (tokno) ;
EndScope ;
PopT(NameEnd) ;
PopT(NameStart) ;
@ -468,12 +468,12 @@ END PCStartBuildInnerModule ;
|------------| |-----------|
*)
PROCEDURE PCEndBuildInnerModule ;
PROCEDURE PCEndBuildInnerModule (tokno: CARDINAL) ;
VAR
NameStart,
NameEnd : Name ;
BEGIN
CheckForUnknownInModule ;
CheckForUnknownInModule (tokno) ;
EndScope ;
PopT(NameEnd) ;
PopT(NameStart) ;

View File

@ -551,7 +551,7 @@ FileUnit := % Pus
ImplementationOrProgramModule ) % PopAuto %
=:
ProgramModule := % VAR begint, endt: CARDINAL ; %
ProgramModule := % VAR begint, endt, namet: CARDINAL ; %
% begint := GetTokenNo () %
"MODULE" % M2Error.DefaultProgramModule %
% PushAutoOn %
@ -566,14 +566,15 @@ ProgramModule := % VAR
% StartBuildInit (begint) %
Block % PushAutoOn %
% endt := GetTokenNo () -1 %
% namet := GetTokenNo () %
Ident % EndBuildFile (endt) %
% P3EndBuildProgModule %
% P3EndBuildProgModule (namet) %
"." % PopAuto ;
EndBuildInit (endt) ;
PopAuto %
=:
ImplementationModule := % VAR begint, endt: CARDINAL ; %
ImplementationModule := % VAR begint, endt, namet: CARDINAL ; %
% begint := GetTokenNo () %
"IMPLEMENTATION" % M2Error.DefaultImplementationModule %
"MODULE" % PushAutoOn %
@ -588,8 +589,9 @@ ImplementationModule := % VAR
% StartBuildInit (begint) %
Block % PushAutoOn %
% endt := GetTokenNo () -1 %
% namet := GetTokenNo () %
Ident % EndBuildFile (endt) %
% P3EndBuildImpModule %
% P3EndBuildImpModule (namet) %
"." % PopAuto ;
EndBuildInit (endt) ;
PopAuto ;
@ -1229,7 +1231,7 @@ DefOptArg := "[" Ident ":" FormalType "=" SilentConstExpression "]" =:
FormalType := { "ARRAY" "OF" } Qualident =:
ModuleDeclaration := % VAR begint: CARDINAL ; %
ModuleDeclaration := % VAR begint, namet: CARDINAL ; %
% begint := GetTokenNo () %
"MODULE" % M2Error.DefaultInnerModule %
% PushAutoOn %
@ -1242,7 +1244,8 @@ ModuleDeclaration := % VAR
} [ Export
]
Block % PushAutoOn %
Ident % EndBuildInnerModule %
% namet := GetTokenNo () %
Ident % EndBuildInnerModule (namet) %
% PopAuto ; PopAuto ; PopAuto %
=:
@ -1258,7 +1261,7 @@ Import := "FROM" Ident "IMPORT" IdentList ";" |
"IMPORT"
IdentList ";" =:
DefinitionModule := % VAR begint, endt: CARDINAL ; %
DefinitionModule := % VAR begint, endt, namet: CARDINAL ; %
% begint := GetTokenNo () %
"DEFINITION" % M2Error.DefaultDefinitionModule %
"MODULE" % PushAutoOn %
@ -1272,8 +1275,9 @@ DefinitionModule := % VAR
]
{ Definition } % endt := GetTokenNo () %
"END" % PushAutoOn %
% namet := GetTokenNo () %
Ident % EndBuildFile (endt) ;
P3EndBuildDefModule %
P3EndBuildDefModule (namet) %
"." % PopAuto ; PopAuto ; PopAuto %
=:

View File

@ -2124,7 +2124,7 @@ PROCEDURE CheckForUndeclaredExports (ModSym: CARDINAL) ;
an error message is displayed.
*)
PROCEDURE CheckForUnknownInModule ;
PROCEDURE CheckForUnknownInModule (tokno: CARDINAL) ;
(*

View File

@ -9585,29 +9585,29 @@ END ForeachParamSymDo ;
an error message is displayed.
*)
PROCEDURE CheckForUnknownInModule ;
PROCEDURE CheckForUnknownInModule (tokno: CARDINAL) ;
VAR
pSym: PtrToSymbol ;
BEGIN
pSym := GetPsym(GetCurrentModuleScope()) ;
pSym := GetPsym (GetCurrentModuleScope ()) ;
WITH pSym^ DO
CASE SymbolType OF
DefImpSym: WITH DefImp DO
CheckForUnknowns (name, ExportQualifiedTree,
CheckForUnknowns (tokno, name, ExportQualifiedTree,
'EXPORT QUALIFIED') ;
CheckForUnknowns (name, ExportUnQualifiedTree,
CheckForUnknowns (tokno, name, ExportUnQualifiedTree,
'EXPORT UNQUALIFIED') ;
CheckForSymbols (ExportRequest,
'requested by another modules import (symbols have not been exported by the appropriate definition module)') ;
CheckForUnknowns (name, Unresolved, 'unresolved') ;
CheckForUnknowns (name, LocalSymbols, 'locally used')
CheckForSymbols (ExportRequest,
'requested by another modules import (symbols have not been exported by the appropriate definition module)') ;
CheckForUnknowns (tokno, name, Unresolved, 'unresolved') ;
CheckForUnknowns (tokno, name, LocalSymbols, 'locally used')
END |
ModuleSym: WITH Module DO
CheckForUnknowns (name, Unresolved, 'unresolved') ;
CheckForUnknowns (name, ExportUndeclared, 'exported but undeclared') ;
CheckForUnknowns (name, ExportTree, 'exported but undeclared') ;
CheckForUnknowns (name, LocalSymbols, 'locally used')
CheckForUnknowns (tokno, name, Unresolved, 'unresolved') ;
CheckForUnknowns (tokno, name, ExportUndeclared, 'exported but undeclared') ;
CheckForUnknowns (tokno, name, ExportTree, 'exported but undeclared') ;
CheckForUnknowns (tokno, name, LocalSymbols, 'locally used')
END
ELSE
@ -9626,7 +9626,7 @@ BEGIN
IF IsUnreportedUnknown (sym)
THEN
IncludeElementIntoSet (ReportedUnknowns, sym) ;
MetaErrorStringT1 (GetFirstUsed (sym), InitString ("unknown symbol {%1EUad}"), sym)
MetaErrorStringT1 (GetFirstUsed (sym), InitString ("unknown symbol {%1EUad} {%1&s}"), sym)
END
END UnknownSymbolError ;
@ -9705,22 +9705,24 @@ END Listify ;
together with an error message.
*)
PROCEDURE CheckForUnknowns (name: Name; Tree: SymbolTree;
PROCEDURE CheckForUnknowns (tokno: CARDINAL; name: Name; Tree: SymbolTree;
a: ARRAY OF CHAR) ;
VAR
s: String ;
BEGIN
IF DoesTreeContainAny(Tree, IsUnreportedUnknown)
IF DoesTreeContainAny (Tree, IsUnreportedUnknown)
THEN
CurrentError := NewError(GetTokenNo()) ;
s := InitString("{%E} the following unknown symbols in module %<") ;
s := ConCat(s, Mark(InitStringCharStar(KeyToCharStar(name)))) ;
s := ConCat(s, Mark(InitString('%> were '))) ;
s := ConCat(s, Mark(InitString(a))) ;
s := ConCat (s, Mark (InitString (': '))) ;
s := ConCat (s, Mark (Listify (Tree, IsUnreportedUnknown))) ;
MetaErrorStringT0(GetTokenNo(), s) ;
ForeachNodeDo(Tree, UnknownSymbolError)
ForeachNodeDo (Tree, UnknownSymbolError) ;
IF NoOfNodes (Tree, IsUnreportedUnknown) > 0
THEN
s := InitString ("{%E} the following unknown symbols in module %<") ;
s := ConCat (s, Mark (InitStringCharStar (KeyToCharStar (name)))) ;
s := ConCat (s, Mark (InitString ('%> were '))) ;
s := ConCat (s, Mark (InitString (a))) ;
s := ConCat (s, Mark (InitString (': '))) ;
s := ConCat (s, Mark (Listify (Tree, IsUnreportedUnknown))) ;
MetaErrorStringT0 (tokno, s)
END
END
END CheckForUnknowns ;

View File

@ -0,0 +1,9 @@
MODULE badconst ;
CONST
foo = 1 ;
BEGIN
IF Foo = 1
THEN
END
END badconst.

View File

@ -0,0 +1,11 @@
MODULE badtype ;
FROM SYSTEM IMPORT TSIZE ;
TYPE
foo = CARDINAL ;
BEGIN
IF TSIZE (Foo) = 1
THEN
END
END badtype.

View File

@ -0,0 +1,7 @@
MODULE badvar ;
VAR
foo: CARDINAL ;
BEGIN
Foo := 1
END badvar.