modula2: issue the parameter incompatibility error message based on dialect

This tiny patch improves the parameter incompatibility error message by
having a different message for the dialect chosen mentioning the specific
violation.  PIM uses assignment rules for pass by value and expression
rules for pass by reference.  ISO uses expression type checking for
pass by value and pass by reference.

gcc/m2/ChangeLog:

	* gm2-compiler/M2FileName.def (CalculateFileName): Remove
	quoted string in comment.
	* gm2-compiler/M2Range.mod (FoldTypeParam): Generate dialect
	specific parameter incompatibility error message.

Signed-off-by: Gaius Mulley <gaiusmod2@gmail.com>
This commit is contained in:
Gaius Mulley 2024-04-25 15:19:30 +01:00
parent 59ff81835f
commit 070dd5c883
2 changed files with 28 additions and 6 deletions

View file

@ -39,7 +39,7 @@ EXPORT QUALIFIED CalculateFileName, CalculateStemName, ExtractExtension ;
given a module and an extension. This file name
length will be operating system specific.
String, Extension, is concatenated onto
Module and thus it is safe to `Mark' the extension
Module and thus it is safe to Mark the extension
for garbage collection.
*)

View file

@ -56,7 +56,7 @@ FROM M2Debug IMPORT Assert ;
FROM Indexing IMPORT Index, InitIndex, InBounds, PutIndice, GetIndice ;
FROM Storage IMPORT ALLOCATE ;
FROM M2ALU IMPORT PushIntegerTree, PushInt, ConvertToInt, Equ, Gre, Less, GreEqu ;
FROM M2Options IMPORT VariantValueChecking, CaseEnumChecking ;
FROM M2Options IMPORT VariantValueChecking, CaseEnumChecking, GetPIM ;
FROM M2Error IMPORT Error, InternalError, ErrorFormat0, ErrorFormat1, ErrorFormat2, FlushErrors,
GetAnnounceScope ;
@ -1693,14 +1693,36 @@ END FoldTypeAssign ;
(*
FoldTypeParam -
FoldTypeParam - performs a parameter check between actual and formal.
The quad is removed if the check succeeds.
*)
PROCEDURE FoldTypeParam (q: CARDINAL; tokenNo: CARDINAL; formal, actual, procedure: CARDINAL; paramNo: CARDINAL) ;
VAR
compatible: BOOLEAN ;
BEGIN
IF ParameterTypeCompatible (tokenNo,
'{%4EN} parameter type failure between actual parameter type {%3ad} and the formal type {%2ad}',
procedure, formal, actual, paramNo, IsVarParam (procedure, paramNo))
compatible := FALSE ;
IF IsVarParam (procedure, paramNo)
THEN
(* Expression type compatibility rules for pass by reference parameters. *)
compatible := ParameterTypeCompatible (tokenNo,
'{%4EN} parameter failure due to expression incompatibility ' +
'between actual parameter {%3ad} and the {%4N} formal {%2ad} parameter in procedure {%1ad}',
procedure, formal, actual, paramNo, TRUE)
ELSIF GetPIM ()
THEN
(* Assignment type compatibility rules for pass by value PIM parameters. *)
compatible := ParameterTypeCompatible (tokenNo,
'{%4EN} parameter failure due to assignment incompatibility ' +
'between actual parameter {%3ad} and the {%4N} formal {%2ad} parameter in procedure {%1ad}',
procedure, formal, actual, paramNo, FALSE)
ELSE
compatible := ParameterTypeCompatible (tokenNo,
'{%4EN} parameter failure due to parameter incompatibility ' +
'between actual parameter {%3ad} and the {%4N} formal {%2ad} parameter in procedure {%1ad}',
procedure, formal, actual, paramNo, FALSE)
END ;
IF compatible
THEN
SubQuad(q)
END