[modula2] Location improvement and bugfix when issuing parameter errors

This patch improves the accuracy of error messages mentioning a
parameter in M2Quads.mod (when handling builtins).  The error location
now points to the parameter rather than the function or procedure.

gcc/m2/ChangeLog:

	* gm2-compiler/M2Quads.mod (BuildDifAdrFunction): Removed
	unnecessary in error message.  Use vartok for location.
	(BuildOddFunction): Use optok for location.
	(BuildAbsFunction): Use vartok for location.  Bugfix set vartok.
	(BuildCapFunction): Use optok for location.
	(BuildOrdFunction): Use optok for location and correct format
	specifier.
	(BuildShiftFunction): Use vartok for location.
	(BuildRotateFunction): Use vartok for location.
	(BuildTruncFunction): Use vartok for location.
	(BuildFloatFunction): Use vartok for location.
	(BuildReFunction): Use vartok for location.
	(BuildImFunction): Use vartok for location.
	* gm2-compiler/M2SymInit.mod (trashParam): Remove commented code.

gcc/testsuite/ChangeLog:

	* gm2/errors/fail/badabs.mod: New test.
	* gm2/errors/fail/badenum.mod: New test.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
This commit is contained in:
Gaius Mulley 2023-07-19 17:46:52 +01:00
parent 73d3bc3481
commit 029c7ebe7f
4 changed files with 44 additions and 26 deletions

View file

@ -8127,22 +8127,23 @@ BEGIN
PushT (2) ; (* Two parameters *)
BuildConvertFunction
ELSE
MetaError1 ('the second parameter to {%EkDIFADR } {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsd}',
MetaError1 ('the second parameter to {%EkDIFADR} {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsd}',
OperandSym) ;
PushTFtok (MakeConstLit (combinedtok, MakeKey ('0'), Integer), Integer, combinedtok)
END
ELSE
MetaError1 ('the first parameter to {%EkDIFADR } {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsd}',
VarSym) ;
MetaErrorT1 (vartok,
'the first parameter to {%EkDIFADR} {%1Ea} must be a variable of type ADDRESS or a {%EkPOINTER}, rather than a {%1Etsd}',
VarSym) ;
PushTFtok (MakeConstLit (combinedtok, MakeKey ('0'), Integer), Integer, combinedtok)
END
ELSE
MetaError0 ('{%E}SYSTEM procedure {%EkDIFADR } expects a variable of type ADDRESS or POINTER as its first parameter') ;
MetaError0 ('{%E}SYSTEM procedure {%EkDIFADR} expects a variable of type ADDRESS or POINTER as its first parameter') ;
PushTFtok (MakeConstLit (combinedtok, MakeKey('0'), Integer), Integer, combinedtok)
END
ELSE
combinedtok := MakeVirtualTok (functok, functok, optok) ;
MetaErrorT0 (functok, '{%E}SYSTEM procedure {%EkDIFADR } expects 2 parameters') ;
MetaErrorT0 (functok, '{%E}SYSTEM procedure {%EkDIFADR} expects 2 parameters') ;
PopN (NoOfParam+1) ;
PushTFtok (MakeConstLit (combinedtok, MakeKey('0'), Integer), Integer, combinedtok)
END
@ -8522,14 +8523,14 @@ BEGIN
PushTtok (Res, combinedtok)
ELSE
MetaErrorT1 (combinedtok,
MetaErrorT1 (optok,
'the parameter to {%1EkODD} must be a variable or constant, seen {%1ad}',
Var) ;
PushTtok (False, combinedtok)
END
ELSE
MetaErrorT1 (functok,
'the pseudo procedure {%1EkODD} only has one parameter, seen {%1n} parameters',
'the pseudo procedure {%E1kODD} only has one parameter, seen {%1n} parameters',
NoOfParam) ;
PushTtok (False, functok)
END
@ -8573,6 +8574,7 @@ END BuildOddFunction ;
PROCEDURE BuildAbsFunction ;
VAR
vartok,
functok,
combinedtok: CARDINAL ;
NoOfParam,
@ -8584,6 +8586,7 @@ BEGIN
IF NoOfParam = 1
THEN
Var := OperandT (1) ;
vartok := OperandTok (1) ;
combinedtok := MakeVirtualTok (functok, functok, vartok) ;
IF IsVar(Var) OR IsConst(Var)
THEN
@ -8596,7 +8599,7 @@ BEGIN
GenQuadO (combinedtok, StandardFunctionOp, Res, ProcSym, Var, FALSE) ;
PushTFtok (Res, GetSType (Var), combinedtok)
ELSE
MetaErrorT1 (combinedtok,
MetaErrorT1 (vartok,
'the parameter to {%AkABS} must be a variable or constant, seen {%1ad}',
Var)
END
@ -8656,7 +8659,7 @@ BEGIN
GenQuadO (combinedtok, StandardFunctionOp, Res, ProcSym, Var, FALSE) ;
PushTFtok (Res, Char, combinedtok)
ELSE
MetaErrorT1 (functok,
MetaErrorT1 (optok,
'the parameter to {%AkCAP} must be a variable or constant, seen {%1ad}',
Var)
END
@ -8726,7 +8729,7 @@ BEGIN
PushT (2) ; (* Two parameters *)
BuildConvertFunction
ELSE
MetaErrorT1 (functok,
MetaErrorT1 (optok,
'the parameter to {%AkCHR} must be a variable or constant, seen {%1ad}',
Var)
END
@ -8797,13 +8800,13 @@ BEGIN
PushT (2) ; (* Two parameters *)
BuildConvertFunction
ELSE
MetaErrorT2 (functok,
'the parameter to {%1Ak%a} must be a variable or constant, seen {%2ad}',
MetaErrorT2 (optok,
'the parameter to {%1Aa} must be a variable or constant, seen {%2ad}',
Sym, Var)
END
ELSE
MetaErrorT2 (functok,
'the pseudo procedure {%1Ak%a} only has one parameter, seen {%2n} parameters',
'the pseudo procedure {%1Aa} only has one parameter, seen {%2n} parameters',
Sym, NoOfParam)
END
END BuildOrdFunction ;
@ -8868,14 +8871,14 @@ BEGIN
BuildConvertFunction
ELSE
combinedtok := MakeVirtualTok (functok, optok, optok) ;
MetaErrorT2 (combinedtok,
'the parameter to {%1Ek%a} must be a variable or constant, seen {%2ad}',
MetaErrorT2 (optok,
'the parameter to {%1Ea} must be a variable or constant, seen {%2ad}',
Sym, Var) ;
PushTtok (combinedtok, MakeConstLit (combinedtok, MakeKey ('0'), ZType))
END
ELSE
MetaErrorT2 (functok,
'the pseudo procedure {%1Ek%a} only has one parameter, seen {%2n} parameters',
'the pseudo procedure {%1Ea} only has one parameter, seen {%2n} parameters',
Sym, NoOfParam) ;
PushTtok (functok, MakeConstLit (functok, MakeKey ('0'), ZType))
END
@ -9024,8 +9027,9 @@ BEGIN
GenQuad (LogicalShiftOp, returnVar, varSet, derefExp) ;
PushTFtok (returnVar, GetSType (varSet), combinedtok)
ELSE
MetaError1 ('SYSTEM procedure {%1EkSHIFT} expects a constant or variable which has a type of SET as its first parameter, seen {%1ad}',
varSet) ;
MetaErrorT1 (vartok,
'SYSTEM procedure {%1EkSHIFT} expects a constant or variable which has a type of SET as its first parameter, seen {%1ad}',
varSet) ;
PushTFtok (MakeConstLit (combinedtok, MakeKey ('0'), Cardinal), Cardinal, combinedtok)
END
ELSE
@ -9099,8 +9103,9 @@ BEGIN
GenQuadO (combinedtok, LogicalRotateOp, returnVar, varSet, derefExp, TRUE) ;
PushTFtok (returnVar, GetSType (varSet), combinedtok)
ELSE
MetaErrorT0 (functok,
'SYSTEM procedure {%EkROTATE} expects a constant or variable which has a type of SET as its first parameter') ;
MetaErrorT1 (vartok,
'SYSTEM procedure {%EkROTATE} expects a constant or variable which has a type of SET as its first parameter, seen {%1ad}',
varSet) ;
PushTFtok (MakeConstLit (functok, MakeKey('0'), Cardinal), Cardinal, functok)
END
ELSE
@ -9685,7 +9690,7 @@ BEGIN
PushTFtok (MakeConstLit (functok, MakeKey('0'), Type), Type, functok)
END
ELSE
MetaErrorT2 (functok,
MetaErrorT2 (vartok,
'argument to {%1E%ad} must be a variable or constant, seen {%2ad}',
Sym, Var) ;
PushTFtok (MakeConstLit (functok, MakeKey('0'), Type), Type, functok)
@ -9764,7 +9769,7 @@ BEGIN
PushT(2) ; (* two parameters. *)
BuildConvertFunction
ELSE
MetaErrorT1 (functok,
MetaErrorT1 (vartok,
'argument to {%1E%ad} must be a variable or constant', ProcSym) ;
PushTFtok (MakeConstLit (functok, MakeKey('0.0'), Type), Type, functok)
END
@ -9834,7 +9839,7 @@ BEGIN
ELSE
PopN (NoOfParam+1) ; (* destroy arguments to this function *)
PushTFtok (MakeConstLit (combinedtok, MakeKey ('1.0'), RType), RType, combinedtok) ;
MetaErrorT2 (functok,
MetaErrorT2 (vartok,
'the parameter to the builtin procedure function {%1Ead} must be a constant or a variable, seen {%2ad}',
func, Var)
END
@ -9902,7 +9907,7 @@ BEGIN
ELSE
PopN (NoOfParam+1) ; (* destroy arguments to this function *)
PushTFtok (MakeConstLit (combinedtok, MakeKey ('1.0'), RType), RType, combinedtok) ;
MetaErrorT2 (functok,
MetaErrorT2 (vartok,
'the parameter to the builtin procedure function {%1Ead} must be a constant or a variable, seen {%2ad}',
func, Var)
END

View file

@ -1550,8 +1550,6 @@ BEGIN
THEN
IF IsDeallocate (op2)
THEN
(* SetupLAlias (ptr, heapSym) *)
(* SetupIndr (ptr, Nil) *)
SetupLAlias (ptr, Nil)
ELSE
SetupIndr (ptr, heapSym)

View file

@ -0,0 +1,7 @@
MODULE badabs ;
VAR
c: CARDINAL ;
BEGIN
c := ABS (foo)
END badabs.

View file

@ -0,0 +1,8 @@
MODULE badenum ;
TYPE
color = (red, blue, green) ;
BEGIN
red := 1
END badenum.