blob: 8d6546a4b1630bde8dd0374e57c241e7df07dfd1 [file] [log] [blame]
(* M2Base.def provides a mechanism to check fundamental types.
Copyright (C) 2001-2025 Free Software Foundation, Inc.
Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
This file is part of GNU Modula-2.
GNU Modula-2 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Modula-2 is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU Modula-2; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. *)
DEFINITION MODULE M2Base ;
(* M2Base implements the default base types and base procedures in the
Modula-2 front end. *)
FROM NameKey IMPORT Name ;
FROM gcctypes IMPORT location_t ;
VAR
TemplateProcedure,
ActivationPointer,
Nil,
Cardinal, Integer,
Boolean, True, False,
Char, Proc,
LongInt, LongCard,
ShortInt, ShortCard,
ZType, RType, CType,
Real,
LongReal, ShortReal,
Complex, LongComplex,
ShortComplex,
High, LengthS,
Cap, Abs, Odd,
Convert, Val,
Chr,
Re, Im, Cmplx,
Min, Max,
New, Dispose,
Inc, Dec,
Incl, Excl,
ExceptionAssign,
ExceptionReturn,
ExceptionInc,
ExceptionDec,
ExceptionIncl,
ExceptionExcl,
ExceptionShift,
ExceptionRotate,
ExceptionStaticArray,
ExceptionDynamicArray,
ExceptionForLoopBegin,
ExceptionForLoopTo,
ExceptionForLoopEnd,
ExceptionPointerNil,
ExceptionNoReturn,
ExceptionCase,
ExceptionNonPosDiv,
ExceptionNonPosMod,
ExceptionZeroDiv,
ExceptionZeroRem,
ExceptionWholeValue,
ExceptionRealValue,
ExceptionParameterBounds,
ExceptionNo : CARDINAL ;
(*
InitBase - initializes the base types and functions
used in the Modula-2 compiler.
*)
PROCEDURE InitBase (location: location_t; VAR sym: CARDINAL) ;
(*
GetBaseTypeMinMax - returns the minimum and maximum values for a
given base type. This procedure should only
be called if the type is NOT a subrange.
*)
PROCEDURE GetBaseTypeMinMax (type: CARDINAL; VAR min, max: CARDINAL) ;
(*
IsPseudoBaseFunction - returns true if Sym is a Base function.
*)
PROCEDURE IsPseudoBaseFunction (Sym: CARDINAL) : BOOLEAN ;
(*
IsPseudoBaseProcedure - returns true if Sym is a Base procedure.
*)
PROCEDURE IsPseudoBaseProcedure (Sym: CARDINAL) : BOOLEAN ;
(*
IsNeededAtRunTime - returns TRUE if procedure, sym, is a
runtime procedure. Ie a procedure which is
not a pseudo procedure and which is implemented
in M2RTS or SYSTEM and also exported.
*)
PROCEDURE IsNeededAtRunTime (tok: CARDINAL; sym: CARDINAL) : BOOLEAN ;
(*
IsBaseType - returns TRUE if Sym is a Base type.
*)
PROCEDURE IsBaseType (Sym: CARDINAL) : BOOLEAN ;
(*
IsOrdinalType - returns TRUE if, sym, is an ordinal type.
An ordinal type is defined as:
a base type which contains whole numbers or
a subrange type or an enumeration type.
*)
PROCEDURE IsOrdinalType (Sym: CARDINAL) : BOOLEAN ;
(*
IsOrd - returns TRUE if, sym, is ORD or its typed counterparts
ORDL, ORDS.
*)
PROCEDURE IsOrd (sym: CARDINAL) : BOOLEAN ;
(*
IsTrunc - returns TRUE if, sym, is TRUNC or its typed counterparts
TRUNCL, TRUNCS.
*)
PROCEDURE IsTrunc (sym: CARDINAL) : BOOLEAN ;
(*
IsFloat - returns TRUE if, sym, is FLOAT or its typed counterparts
FLOATL, FLOATS.
*)
PROCEDURE IsFloat (sym: CARDINAL) : BOOLEAN ;
(*
IsInt - returns TRUE if, sym, is INT or its typed counterparts
INTL, INTS.
*)
PROCEDURE IsInt (sym: CARDINAL) : BOOLEAN ;
(*
AssignmentRequiresWarning - returns TRUE if t1 and t2 can be used during
an assignment, but should generate a warning.
For example in PIM we can assign ADDRESS
and WORD providing they are both the
same size.
*)
PROCEDURE AssignmentRequiresWarning (t1, t2: CARDINAL) : BOOLEAN ;
(*
IsAssignmentCompatible - returns TRUE if t1 and t2 are assignment
compatible.
*)
PROCEDURE IsAssignmentCompatible (t1, t2: CARDINAL) : BOOLEAN ;
(*
IsExpressionCompatible - returns TRUE if t1 and t2 are expression
compatible.
*)
PROCEDURE IsExpressionCompatible (t1, t2: CARDINAL) : BOOLEAN ;
(*
IsParameterCompatible - returns TRUE if types t1 and t2 are parameter
compatible.
*)
PROCEDURE IsParameterCompatible (t1, t2: CARDINAL) : BOOLEAN ;
(*
IsComparisonCompatible - returns TRUE if t1 and t2 are comparison
compatible. PIM allows INTEGER and ADDRESS within
expressions but we warn against their comparison.
*)
PROCEDURE IsComparisonCompatible (t1, t2: CARDINAL) : BOOLEAN ;
(*
IsValidParameter - returns TRUE if an, actual, parameter can be passed
to the, formal, parameter. This differs from
IsParameterCompatible as this procedure includes checks
for unbounded formal parameters, var parameters and
constant actual parameters.
*)
PROCEDURE IsValidParameter (formal, actual: CARDINAL) : BOOLEAN ;
(*
CheckExpressionCompatible - returns if t1 and t2 are compatible types for
+, -, *, DIV, >, <, =, etc.
If t1 and t2 are not compatible then an error
message is displayed.
*)
PROCEDURE CheckExpressionCompatible (tok: CARDINAL;
left, right: CARDINAL) ;
(*
CheckAssignmentCompatible - returns if t1 and t2 are compatible types for
:=, =, #.
If t1 and t2 are not compatible then an error
message is displayed.
*)
PROCEDURE CheckAssignmentCompatible (tok: CARDINAL;
left, right: CARDINAL) ;
(*
CheckParameterCompatible - checks to see if types, t1, and, t2, are
compatible for parameter passing.
*)
PROCEDURE CheckParameterCompatible (tok: CARDINAL;
t1, t2: CARDINAL) ;
(*
CannotCheckTypeInPass3 - returns TRUE if we are unable to check the
type of, e, in pass 3.
*)
PROCEDURE CannotCheckTypeInPass3 (e: CARDINAL) : BOOLEAN ;
(*
MixTypes - given types leftType and rightType return a type symbol that
provides expression type compatibility.
NearTok is used to identify the source position if a type
incompatability occurs.
*)
PROCEDURE MixTypes (leftType, rightType: CARDINAL; NearTok: CARDINAL) : CARDINAL ;
(*
MixTypesDecl - returns a type symbol which provides expression compatibility
between leftType and rightType. An error is emitted if this
is not possible. left and right are the source (variable,
constant) of leftType and rightType respectively.
*)
PROCEDURE MixTypesDecl (left, right, leftType, rightType: CARDINAL;
NearTok: CARDINAL) : CARDINAL ;
(*
NegateType - if the type is unsigned then returns the
signed equivalent.
*)
PROCEDURE NegateType (type: CARDINAL (* ; sympos: CARDINAL *) ) : CARDINAL ;
(*
IsMathType - returns TRUE if the type is a mathematical type.
A mathematical type has a range larger than INTEGER.
(Typically REAL/LONGREAL/LONGINT)
*)
PROCEDURE IsMathType (type: CARDINAL) : BOOLEAN ;
(*
IsRealType - returns TRUE if, t, is a real type.
*)
PROCEDURE IsRealType (t: CARDINAL) : BOOLEAN ;
(*
IsComplexType - returns TRUE if, sym, is COMPLEX,
LONGCOMPLEX or SHORTCOMPLEX.
*)
PROCEDURE IsComplexType (sym: CARDINAL) : BOOLEAN ;
(*
ComplexToScalar - returns the scalar (or base type) of the complex type, sym.
*)
PROCEDURE ComplexToScalar (sym: CARDINAL) : CARDINAL ;
(*
ScalarToComplex - given a real type, t, return the equivalent complex type.
*)
PROCEDURE ScalarToComplex (sym: CARDINAL) : CARDINAL ;
(*
GetCmplxReturnType - this code implements the table given in the
ISO standard Page 293 with an addition for
SHORTCOMPLEX and the fixed sized COMPLEX
types found in the GNU Modula-2 SYSTEM
Module.
*)
PROCEDURE GetCmplxReturnType (t1, t2: CARDINAL) : CARDINAL ;
END M2Base.