Assignment compatibility#
This section discusses the assignment issues surrounding assignment
compatibility of elementary types (INTEGER
, CARDINAL
,
REAL
and CHAR
for example). The information here is
found in more detail in the Modula-2 ISO standard BS ISO/IEC
10514-1:1996 page 122.
Assignment compatibility exists between the same sized elementary types.
Same type family of different sizes are
also compatible as long as the MAX(
type )
and
MIN(
type )
is known. So for example this includes the
INTEGER
family, CARDINAL
family and the REAL
family.
The reason for this is that when the assignment is performed
the compiler will check to see that the expression (on the right of
the :=
) lies within the range of the designator type (on the
left hand side of the :=
). Thus these ordinal types can be
assignment compatible. However it does mean that WORD32
is not
compatible with WORD16
as WORD32
does not have a minimum
or maximum value and therefore cannot be checked. The compiler does
not know which of the two bytes from WORD32
should be copied
into WORD16
and which two should be ignored. Currently the
types BITSET8
, BITSET16
and BITSET32
are
assignment incompatible. However this restriction maybe lifted when
further runtime checking is achieved.
Modula-2 does allow INTEGER
to be assignment compatible with
WORD
as they are the same size. Likewise GNU Modula-2 allows
INTEGER16
to be compatible with WORD16
and the same for
the other fixed sized types and their sized equivalent in either
WORD
n, BYTE
or LOC
types. However it prohibits
assignment between WORD
and WORD32
even though on many
systems these sizes will be the same. The reasoning behind this rule
is that the extended fixed sized types are meant to be used by
applications requiring fixed sized data types and it is more portable
to forbid the bluring of the boundaries between fixed sized and
machine dependant sized types.
Intemediate code runtime checking is always generated by the front end. However this intemediate code is only translated into actual code if the appropriate command line switches are specified. This allows the compiler to perform limited range checking at compile time. In the future it will allow the extensive GCC optimisations to propagate constant values through to the range checks which if they are found to exceed the type range will result in a compile time error message.