https://gcc.gnu.org/g:eadd05d5601063bd0c7ef6c3606b4eeb856d57d7

commit r14-9998-geadd05d5601063bd0c7ef6c3606b4eeb856d57d7
Author: Gaius Mulley <gaiusm...@gmail.com>
Date:   Tue Apr 16 23:08:43 2024 +0100

    PR modula2/114745: const cast causes ICE
    
    This patch allows SYSTEM.CAST to be used during a const expression and
    prevents an ICE.
    
    gcc/m2/ChangeLog:
    
            PR modula2/114745
            * gm2-compiler/M2Code.mod (DumpLangDecl): Replace with ...
            (GetDumpDecl): ... this.
            (DumpLangGimple): Replace with ...
            (GetDumpGimple): ... this.
            * gm2-compiler/M2GenGCC.mod:
            * gm2-compiler/M2LangDump.mod (GetDumpLangQuadFilename): Replace 
with ...
            (GetDumpQuadFilename): ... this.
            (GetDumpLangDeclFilename): Replace with ...
            (GetDumpDeclFilename): ... this.
            (GetDumpLangGimpleFilename): Replace with ...
            (GetDumpGimpleFilename): ... this.
            * gm2-compiler/M2Options.def (GetDumpLangDeclFilename): New
            procedure function.
            (GetDumpDeclFilename): Ditto.
            (SetDumpLangDeclFilename): New procedure.
            (SetDumpDeclFilename): Ditto.
            (GetDumpLangQuadFilename): New procedure function.
            (GetDumpQuadFilename): Ditto
            (SetDumpLangQuadFilename): New procedure.
            (SetDumpQuadFilename): Ditto.
            (GetDumpLangGimpleFilename): New procedure function.
            (GetDumpGimpleFilename): Ditto.
            (SetDumpLangGimpleFilename): New procedure.
            (SetDumpGimpleFilename): Ditto.
            (GetDumpLangGimple): New procedure function.
            (SetM2Dump): New procedure.
            (GetDumpGimple): New procedure function.
            (GetDumpQuad): Ditto.
            (GetDumpDecl): Ditto.
            * gm2-compiler/M2Options.mod (DumpLangDeclFilename): Remove.
            (DumpLangQuadFilename): Ditto.
            (DumpLangGimpleFilename): Ditto.
            (DumpDeclFilename): New variable.
            (DumpQuadFilename): Ditto.
            (DumpGimpleFilename): Ditto.
            (DebugTraceTree): New variable.
            (SetQuadDebugging): Rewrite.
            (GetDumpLangDeclFilename): Replace with ...
            (GetDumpDeclFilename): ... this.
            (SetDumpLangQuadFilename): Replace with ...
            (SetDumpQuadFilename): ... this.
            (GetDumpLangGimpleFilename): Replace with ...
            (GetDumpGimpleFilename): ... this.
            (SetDumpLangGimpleFilename): Replace with ...
            (SetDumpGimpleFilename): ... this.
            (GetDumpLangGimple): Remove.
            (MatchDump): New procedure function.
            (SetM2Dump): New procedure.
            (GetDumpGimple): New procedure function.
            (GetDumpQuad): Ditto.
            (GetDumpDecl): Ditto.
            (GetDumpLangGimple): Ditto.
            * gm2-compiler/M2Quads.mod (BreakAtQuad): Assigned to 140.
            (BuildTypeCoercion): Add ConstExpr parameter.
            Check for const parameter in a const expression.
            Create a constant temporary if in a const expression.
            (BuildCastFunction): Pass ConstExpr to BuildTypeCoercion.
            (BuildFunctionCall): Pass ConstExpr to BuildTypeCoercion.
            * gm2-compiler/PCSymBuild.mod (buildConstFunction): Test for Cast
            and call InitConvert.
            (ErrorConstFunction): Add CAST to the error message.
            * gm2-compiler/SymbolTable.mod (GetConstStringContent): Remove
            unused procedure.
            * gm2-gcc/m2decl.cc (m2decl_DeclareKnownConstant): Copy value
            and change type of value.
            * gm2-gcc/m2options.h (M2Options_GetDumpLangDeclFilename): Remove.
            (M2Options_SetDumpLangDeclFilename): Ditto.
            (M2Options_GetDumpLangQuadFilename): Ditto.
            (M2Options_SetDumpLangQuadFilename): Ditto.
            (M2Options_GetDumpLangGimpleFilename): Ditto.
            (M2Options_SetDumpLangGimpleFilename): Ditto.
            (M2Options_GetDumpLangGimple): Ditto.
            (M2Options_GetDumpDeclFilename): New function.
            (M2Options_SetDumpDeclFilename): Ditto.
            (M2Options_GetDumpQuadFilename): Ditto.
            (M2Options_SetDumpQuadFilename): Ditto.
            (M2Options_GetDumpGimpleFilename): Ditto.
            (M2Options_SetDumpGimpleFilename): Ditto.
            (M2Options_SetM2Dump): Ditto.
            (M2Options_GetDumpGimple): Ditto.
            * gm2-gcc/m2pp.cc (GM2): New define.
            (m2pp_type_lowlevel): Remove linefeed.
            (m2pp_identifier): Add type description for const.
            (m2pp_assignment): Display lhs/rhs types.
            (m2pp_dump_gimple): Replace GetDumpLangGimple with GetDumpGimple.
            * gm2-lang.cc (ENABLE_QUAD_DUMP_ALL): Remove.
            (ENABLE_M2DUMP_ALL): New define.
            (gm2_langhook_handle_option): Remove commented options
            OPT_fdump_lang_all, OPT_fdump_lang_decl_, OPT_fdump_lang_gimple,
            OPT_fdump_lang_gimple_, OPT_fdump_lang_quad and
            OPT_fdump_lang_quad_.
            Add commented options OPT_fm2_dump_, OPT_fm2_dump_decl_,
            OPT_fm2_dump_gimple_ and OPT_fm2_dump_quad_.
    
    gcc/testsuite/ChangeLog:
    
            PR modula2/114745
            * gm2/iso/const/pass/constcast.mod: New test.
            * gm2/iso/const/pass/constodd.mod: New test.
            * gm2/pim/pass/tinyindr.mod: New test.
    
    Signed-off-by: Gaius Mulley <gaiusm...@gmail.com>

Diff:
---
 gcc/m2/gm2-compiler/M2Code.mod                 |   8 +-
 gcc/m2/gm2-compiler/M2GenGCC.mod               |  26 +--
 gcc/m2/gm2-compiler/M2LangDump.mod             |  10 +-
 gcc/m2/gm2-compiler/M2Options.def              |  52 ++++--
 gcc/m2/gm2-compiler/M2Options.mod              | 214 +++++++++++++++++++------
 gcc/m2/gm2-compiler/M2Quads.mod                |  30 ++--
 gcc/m2/gm2-compiler/PCSymBuild.mod             |   8 +-
 gcc/m2/gm2-compiler/SymbolTable.mod            |  21 ---
 gcc/m2/gm2-gcc/m2decl.cc                       |   4 +-
 gcc/m2/gm2-gcc/m2options.h                     |  15 +-
 gcc/m2/gm2-gcc/m2pp.cc                         |  31 +++-
 gcc/m2/gm2-lang.cc                             |  40 ++---
 gcc/testsuite/gm2/iso/const/pass/constcast.mod |   8 +
 gcc/testsuite/gm2/iso/const/pass/constodd.mod  |  16 ++
 gcc/testsuite/gm2/pim/pass/tinyindr.mod        |  24 +++
 15 files changed, 341 insertions(+), 166 deletions(-)

diff --git a/gcc/m2/gm2-compiler/M2Code.mod b/gcc/m2/gm2-compiler/M2Code.mod
index ea1126d756e..f8a773dc103 100644
--- a/gcc/m2/gm2-compiler/M2Code.mod
+++ b/gcc/m2/gm2-compiler/M2Code.mod
@@ -26,7 +26,7 @@ FROM SYSTEM IMPORT WORD ;
 FROM M2Options IMPORT Statistics, OptimizeUncalledProcedures,
                       OptimizeCommonSubExpressions,
                       StyleChecking, Optimizing, WholeProgram,
-                      DumpLangDecl, DumpLangGimple ;
+                      GetDumpDecl, GetDumpGimple ;
 
 FROM M2LangDump IMPORT CreateDumpDecl, CloseDumpDecl, MakeGimpleTemplate ;
 FROM M2Error IMPORT InternalError ;
@@ -171,7 +171,7 @@ END RemoveUnreachableCode ;
 
 PROCEDURE DoModuleDeclare ;
 BEGIN
-   IF DumpLangDecl
+   IF GetDumpDecl ()
    THEN
       CreateDumpDecl ("symbol resolver of filtered symbols\n") ;
       DumpFilteredResolver
@@ -182,7 +182,7 @@ BEGIN
    ELSE
       StartDeclareScope (GetMainModule ())
    END ;
-   IF DumpLangDecl
+   IF GetDumpDecl ()
    THEN
       CloseDumpDecl ;
       CreateDumpDecl ("definitive declaration of filtered symbols\n") ;
@@ -216,7 +216,7 @@ VAR
    filename: String ;
    len     : CARDINAL ;
 BEGIN
-   IF DumpLangGimple
+   IF GetDumpGimple ()
    THEN
       filename := MakeGimpleTemplate (len) ;
       CreateDumpGimple (filename, len) ;
diff --git a/gcc/m2/gm2-compiler/M2GenGCC.mod b/gcc/m2/gm2-compiler/M2GenGCC.mod
index a45d33ef89e..da52c924974 100644
--- a/gcc/m2/gm2-compiler/M2GenGCC.mod
+++ b/gcc/m2/gm2-compiler/M2GenGCC.mod
@@ -2950,9 +2950,11 @@ BEGIN
          virtpos := MakeVirtualTok (becomespos, despos, exprpos) ;
          CheckOrResetOverflow (exprpos, Mod2Gcc (des), MustCheckOverflow 
(quad)) ;
          AddModGcc (des,
-                    DeclareKnownConstant (TokenToLocation (virtpos),
-                                          Mod2Gcc (GetType (expr)),
-                                          Mod2Gcc (expr)))
+                    BuildConvert (TokenToLocation (virtpos),
+                                  Mod2Gcc (GetType (des)),
+                                  DeclareKnownConstant (TokenToLocation 
(virtpos),
+                                                        Mod2Gcc (GetType 
(expr)),
+                                                        Mod2Gcc (expr)), 
FALSE))
       END
    END ;
    RemoveQuad (p, des, quad) ;
@@ -5328,13 +5330,18 @@ BEGIN
       IF IsValueSolved (left) AND IsValueSolved (right)
       THEN
          (* We can take advantage of the known values and evaluate the 
condition.  *)
-         PushValue (left) ;
-         PushValue (right) ;
-         IF Less (tokenno)
+         IF IsBooleanRelOpPattern (quad)
          THEN
-            PutQuad (quad, GotoOp, NulSym, NulSym, destQuad)
+            FoldBooleanRelopPattern (p, quad)
          ELSE
-            SubQuad (quad)
+            PushValue (left) ;
+            PushValue (right) ;
+            IF Less (tokenno)
+            THEN
+               PutQuad (quad, GotoOp, NulSym, NulSym, destQuad)
+            ELSE
+               SubQuad (quad)
+            END
          END ;
          NoChange := FALSE
       END
@@ -7795,7 +7802,6 @@ PROCEDURE IsValidExpressionRelOp (quad: CARDINAL; isin: 
BOOLEAN) : BOOLEAN ;
 CONST
    Verbose = FALSE ;
 VAR
-   lefttype, righttype,
    left, right, dest, combined,
    leftpos, rightpos, destpos : CARDINAL ;
    constExpr, overflow        : BOOLEAN ;
@@ -7810,8 +7816,6 @@ BEGIN
    DeclareConstant (rightpos, right) ;
    DeclareConstructor (leftpos, quad, left) ;
    DeclareConstructor (rightpos, quad, right) ;
-   lefttype := GetType (left) ;
-   righttype := GetType (right) ;
    IF ExpressionTypeCompatible (combined, "", left, right,
                                 StrictTypeChecking, isin)
    THEN
diff --git a/gcc/m2/gm2-compiler/M2LangDump.mod 
b/gcc/m2/gm2-compiler/M2LangDump.mod
index 17fab86bc0b..ec3522b62dd 100644
--- a/gcc/m2/gm2-compiler/M2LangDump.mod
+++ b/gcc/m2/gm2-compiler/M2LangDump.mod
@@ -40,8 +40,8 @@ FROM SymbolTable IMPORT NulSym,
                         IsExported, IsPublic, IsExtern, IsMonoName,
                         IsDefinitionForC ;
 
-FROM M2Options IMPORT GetM2DumpFilter, GetDumpDir, GetDumpLangQuadFilename,
-                      GetDumpLangDeclFilename, GetDumpLangGimpleFilename ;
+FROM M2Options IMPORT GetM2DumpFilter, GetDumpDir, GetDumpQuadFilename,
+                      GetDumpDeclFilename, GetDumpGimpleFilename ;
 
 FROM M2GCCDeclare IMPORT IncludeDumpSymbol ;
 FROM FormatStrings IMPORT Sprintf0, Sprintf1 ;
@@ -751,7 +751,7 @@ END CreateTemplate ;
 
 PROCEDURE MakeQuadTemplate () : String ;
 BEGIN
-   RETURN CreateTemplate (GetDumpLangQuadFilename (), InitString ('quad'))
+   RETURN CreateTemplate (GetDumpQuadFilename (), InitString ('quad'))
 END MakeQuadTemplate ;
 
 
@@ -761,7 +761,7 @@ END MakeQuadTemplate ;
 
 PROCEDURE MakeDeclTemplate () : String ;
 BEGIN
-   RETURN CreateTemplate (GetDumpLangDeclFilename (), InitString ('decl'))
+   RETURN CreateTemplate (GetDumpDeclFilename (), InitString ('decl'))
 END MakeDeclTemplate ;
 
 
@@ -775,7 +775,7 @@ PROCEDURE MakeGimpleTemplate (VAR len: CARDINAL) : String ;
 VAR
    filename: String ;
 BEGIN
-   filename := CreateTemplate (GetDumpLangGimpleFilename (), InitString 
('gimple')) ;
+   filename := CreateTemplate (GetDumpGimpleFilename (), InitString 
('gimple')) ;
    len := Length (filename) ;  (* This is a short cut based on '%03d' format
                                   specifier used above.  *)
    RETURN filename
diff --git a/gcc/m2/gm2-compiler/M2Options.def 
b/gcc/m2/gm2-compiler/M2Options.def
index 50504d088b6..a3d112c0cdf 100644
--- a/gcc/m2/gm2-compiler/M2Options.def
+++ b/gcc/m2/gm2-compiler/M2Options.def
@@ -53,9 +53,6 @@ VAR
    PedanticCast,                 (* -Wpedantic-cast warns if sizes differ.   *)
    Statistics,                   (* -fstatistics information about code      *)
    StyleChecking,                (* -Wstudents checks for common student errs*)
-   DumpLangDecl,                 (* -fdump-lang-decl.                        *)
-   DumpLangGimple,               (* -fdump-lang-gimple.                      *)
-   DumpLangQuad,                 (* -fq, -fdump-lang-quad dump quadruples.   *)
    UnboundedByReference,         (* -funbounded-by-reference                 *)
    VerboseUnbounded,             (* -Wverbose-unbounded                      *)
    OptimizeUncalledProcedures,   (* -Ouncalled removes uncalled procedures   *)
@@ -1004,45 +1001,45 @@ PROCEDURE GetIEEELongDouble () : BOOLEAN ;
 
 
 (*
-   GetDumpLangDeclFilename - returns the DumpLangDeclFilename.
+   GetDumpDeclFilename - returns the DumpLangDeclFilename.
 *)
 
-PROCEDURE GetDumpLangDeclFilename () : String ;
+PROCEDURE GetDumpDeclFilename () : String ;
 
 
 (*
-   SetDumpLangDeclFilename - set DumpLangDeclFilename to filename.
+   SetDumpDeclFilename - set DumpDeclFilename to filename.
 *)
 
-PROCEDURE SetDumpLangDeclFilename (value: BOOLEAN; filename: ADDRESS) ;
+PROCEDURE SetDumpDeclFilename (value: BOOLEAN; filename: ADDRESS) ;
 
 
 (*
-   GetDumpLangQuadFilename - returns the DumpLangQuadFilename.
+   GetDumpQuadFilename - returns the DumpQuadFilename.
 *)
 
-PROCEDURE GetDumpLangQuadFilename () : String ;
+PROCEDURE GetDumpQuadFilename () : String ;
 
 
 (*
-   SetDumpLangQuadFilename - set DumpLangQuadFilename to filename.
+   SetDumpQuadFilename - set DumpQuadFilename to filename.
 *)
 
-PROCEDURE SetDumpLangQuadFilename (value: BOOLEAN; filename: ADDRESS) ;
+PROCEDURE SetDumpQuadFilename (value: BOOLEAN; filename: ADDRESS) ;
 
 
 (*
-   GetDumpLangGimpleFilename - returns the DumpLangGimpleFilename.
+   GetDumpGimpleFilename - returns the DumpGimpleFilename.
 *)
 
-PROCEDURE GetDumpLangGimpleFilename () : String ;
+PROCEDURE GetDumpGimpleFilename () : String ;
 
 
 (*
-   SetDumpLangGimpleFilename - set DumpLangGimpleFilename to filename.
+   SetDumpGimpleFilename - set DumpGimpleFilename to filename.
 *)
 
-PROCEDURE SetDumpLangGimpleFilename (value: BOOLEAN; filename: ADDRESS) ;
+PROCEDURE SetDumpGimpleFilename (value: BOOLEAN; filename: ADDRESS) ;
 
 
 (*
@@ -1061,10 +1058,31 @@ PROCEDURE GetM2DumpFilter () : ADDRESS ;
 
 
 (*
-   GetDumpLangGimple - return TRUE if -fdump-lang-gimple is set.
+   SetM2Dump - sets the dump via a comma separated list: quad,decl,gimple,all.
 *)
 
-PROCEDURE GetDumpLangGimple () : BOOLEAN ;
+PROCEDURE SetM2Dump (value: BOOLEAN; filter: ADDRESS) ;
+
+
+(*
+   GetDumpGimple - return TRUE if the dump gimple flag is set from SetM2Dump.
+*)
+
+PROCEDURE GetDumpGimple () : BOOLEAN ;
+
+
+(*
+   GetDumpQuad - return TRUE if the dump quad flag is set from SetM2Dump.
+*)
+
+PROCEDURE GetDumpQuad () : BOOLEAN ;
+
+
+(*
+   GetDumpDecl - return TRUE if the dump quad flag is set from SetM2Dump.
+*)
+
+PROCEDURE GetDumpDecl () : BOOLEAN ;
 
 
 (*
diff --git a/gcc/m2/gm2-compiler/M2Options.mod 
b/gcc/m2/gm2-compiler/M2Options.mod
index d04cded17f0..3b230dc3fd5 100644
--- a/gcc/m2/gm2-compiler/M2Options.mod
+++ b/gcc/m2/gm2-compiler/M2Options.mod
@@ -57,9 +57,10 @@ CONST
    DefaultRuntimeModuleOverride = 
"m2iso:RTentity,m2iso:Storage,m2iso:SYSTEM,m2iso:M2RTS,m2iso:RTExceptions,m2iso:IOLink"
 ;
 
 VAR
-   DumpLangDeclFilename,
-   DumpLangQuadFilename,
-   DumpLangGimpleFilename,
+   DumpDeclFilename,
+   DumpQuadFilename,
+   DumpGimpleFilename,
+   M2Dump,
    M2DumpFilter,
    M2Prefix,
    M2PathName,
@@ -76,10 +77,13 @@ VAR
    RuntimeModuleOverride,
    CppArgs              : String ;
    DebugFunctionLineNumbers,
-   DebugTraceQuad,   (* -fdebug-trace-quad.  *)
-   DebugTraceTree,   (* -fdebug-trace-tree.  *)
-   DebugTraceLine,   (* -fdebug-trace-line.  *)
-   DebugTraceToken, (* -fdebug-trace-token.  *)
+   DebugTraceQuad,   (* -fm2-debug-trace=quad.  *)
+   DebugTraceLine,   (* -fm2-debug-trace=line.  *)
+   DebugTraceToken,  (* -fm2-debug-trace=token. *)
+   DebugTraceTree,   (* -fm2-debug-trace=tree.  (not yet implemented).  *)
+   DumpDecl,         (* -fm2-dump=decl.  *)
+   DumpGimple,       (* -fm2-dump=gimple.  *)
+   DumpQuad,         (* -fq, -fm2-dump=quad dump quadruples.  *)
    MFlag,
    MMFlag,
    MPFlag,
@@ -1085,9 +1089,9 @@ END SetSwig ;
 
 PROCEDURE SetQuadDebugging (value: BOOLEAN) ;
 BEGIN
-   DumpLangQuad := value ;
-   DumpLangQuadFilename := KillString (DumpLangQuadFilename) ;
-   DumpLangQuadFilename := InitString ('-')
+   DumpQuad := value ;
+   DumpQuadFilename := KillString (DumpQuadFilename) ;
+   DumpQuadFilename := InitString ('-')
 END SetQuadDebugging ;
 
 
@@ -1140,7 +1144,7 @@ PROCEDURE SetM2DebugTrace (word: String; value: BOOLEAN) ;
 BEGIN
    IF EqualArray (word, 'all')
    THEN
-      (* DebugTraceTree := value *)
+      (* DebugTraceTree := value ;  *)
       DebugTraceQuad := value ;
       DebugTraceToken := value ;
       DebugTraceLine := value
@@ -1796,83 +1800,84 @@ END InitializeLongDoubleFlags ;
 
 
 (*
-   GetDumpLangDeclFilename - returns the DumpLangDeclFilename.
+   GetDumpDeclFilename - returns the DumpDeclFilename.
 *)
 
-PROCEDURE GetDumpLangDeclFilename () : String ;
+PROCEDURE GetDumpDeclFilename () : String ;
 BEGIN
-   RETURN DumpLangDeclFilename
-END GetDumpLangDeclFilename ;
+   RETURN DumpDeclFilename
+END GetDumpDeclFilename ;
 
 
 (*
-   SetDumpLangDeclFilename -
+   SetDumpDeclFilename -
 *)
 
-PROCEDURE SetDumpLangDeclFilename (value: BOOLEAN; filename: ADDRESS) ;
+PROCEDURE SetDumpDeclFilename (value: BOOLEAN; filename: ADDRESS) ;
 BEGIN
-   DumpLangDecl := value ;
-   DumpLangDeclFilename := KillString (DumpLangDeclFilename) ;
+   DumpDecl := value ;
+   DumpDeclFilename := KillString (DumpDeclFilename) ;
    IF filename # NIL
    THEN
-      DumpLangDeclFilename := InitStringCharStar (filename)
+      DumpDeclFilename := InitStringCharStar (filename)
    END
-END SetDumpLangDeclFilename ;
+END SetDumpDeclFilename ;
 
 
 (*
-   GetDumpLangQuadFilename - returns the DumpLangQuadFilename.
+   GetDumpQuadFilename - returns the DumpQuadFilename.
 *)
 
-PROCEDURE GetDumpLangQuadFilename () : String ;
+PROCEDURE GetDumpQuadFilename () : String ;
 BEGIN
-   RETURN DumpLangQuadFilename
-END GetDumpLangQuadFilename ;
+   RETURN DumpQuadFilename
+END GetDumpQuadFilename ;
 
 
 (*
-   SetDumpLangQuadFilename -
+   SetDumpQuadFilename -
 *)
 
-PROCEDURE SetDumpLangQuadFilename (value: BOOLEAN; filename: ADDRESS) ;
+PROCEDURE SetDumpQuadFilename (value: BOOLEAN; filename: ADDRESS) ;
 BEGIN
-   DumpLangQuad := value ;
-   DumpLangQuadFilename := KillString (DumpLangQuadFilename) ;
+   DumpQuad := value ;
+   DumpQuadFilename := KillString (DumpQuadFilename) ;
    IF filename # NIL
    THEN
-      DumpLangQuadFilename := InitStringCharStar (filename)
+      DumpQuadFilename := InitStringCharStar (filename)
    END
-END SetDumpLangQuadFilename ;
+END SetDumpQuadFilename ;
 
 
 (*
-   GetDumpLangGimpleFilename - returns the DumpLangGimpleFilename.
+   GetDumpGimpleFilename - returns the DumpGimpleFilename.
 *)
 
-PROCEDURE GetDumpLangGimpleFilename () : String ;
+PROCEDURE GetDumpGimpleFilename () : String ;
 BEGIN
-   RETURN DumpLangGimpleFilename
-END GetDumpLangGimpleFilename ;
+   RETURN DumpGimpleFilename
+END GetDumpGimpleFilename ;
 
 
 (*
-   SetDumpLangGimpleFilename - set DumpLangGimpleFilename to filename.
+   SetDumpGimpleFilename - set DumpGimpleFilename to filename.
 *)
 
-PROCEDURE SetDumpLangGimpleFilename (value: BOOLEAN; filename: ADDRESS) ;
+PROCEDURE SetDumpGimpleFilename (value: BOOLEAN; filename: ADDRESS) ;
 BEGIN
-   DumpLangGimple := value ;
-   DumpLangGimpleFilename := KillString (DumpLangGimpleFilename) ;
+   DumpGimple := value ;
+   DumpGimpleFilename := KillString (DumpGimpleFilename) ;
    IF value AND (filename # NIL)
    THEN
-      DumpLangGimpleFilename := InitStringCharStar (filename)
+      DumpGimpleFilename := InitStringCharStar (filename)
    END
-END SetDumpLangGimpleFilename ;
+END SetDumpGimpleFilename ;
 
 
 (*
    SetM2DumpFilter - sets the filter to a comma separated list of procedures
-                     and modules.
+                     and modules.  Not to be confused with SetM2Dump below
+                     which enables the class of data structures to be dumped.
 *)
 
 PROCEDURE SetM2DumpFilter (value: BOOLEAN; filter: ADDRESS) ;
@@ -1901,13 +1906,115 @@ END GetM2DumpFilter ;
 
 
 (*
-   GetDumpLangGimple - return TRUE if -fdump-lang-gimple is set.
+   MatchDump - enable/disable dump using value.  It returns TRUE if dump
+               is valid.
 *)
 
-PROCEDURE GetDumpLangGimple () : BOOLEAN ;
+PROCEDURE MatchDump (dump: String; value: BOOLEAN) : BOOLEAN ;
 BEGIN
-   RETURN DumpLangGimple
-END GetDumpLangGimple ;
+   IF EqualArray (dump, 'all')
+   THEN
+      DumpDecl := value ;
+      DumpQuad := value ;
+      DumpGimple := value ;
+      RETURN TRUE
+   ELSIF EqualArray (dump, 'decl')
+   THEN
+      DumpDecl := value ;
+      RETURN TRUE
+   ELSIF EqualArray (dump, 'gimple')
+   THEN
+      DumpGimple := value ;
+      RETURN TRUE
+   ELSIF EqualArray (dump, 'quad')
+   THEN
+      DumpQuad := value ;
+      RETURN TRUE
+   END ;
+   RETURN FALSE
+END MatchDump ;
+
+
+(*
+   SetM2Dump - sets the dump via a comma separated list: quad,decl,gimple,all.
+               It returns TRUE if the comma separated list is valid.
+*)
+
+PROCEDURE SetM2Dump (value: BOOLEAN; filter: ADDRESS) : BOOLEAN ;
+VAR
+   result: BOOLEAN ;
+   dump  : String ;
+   start,
+   i     : INTEGER ;
+BEGIN
+   IF filter = NIL
+   THEN
+      RETURN FALSE
+   END ;
+   IF M2Dump # NIL
+   THEN
+      M2Dump := KillString (M2Dump)
+   END ;
+   M2Dump := InitStringCharStar (filter) ;
+   start := 0 ;
+   REPEAT
+      i := Index (M2Dump, ',', start) ;
+      IF i = -1
+      THEN
+         dump := Slice (M2Dump, start, 0)
+      ELSE
+         dump := Slice (M2Dump, start, i)
+      END ;
+      result := MatchDump (dump, value) ;
+      dump := KillString (dump) ;
+      IF NOT result
+      THEN
+         RETURN FALSE
+      END ;
+      start := i+1 ;
+   UNTIL i = -1 ;
+   RETURN TRUE
+END SetM2Dump ;
+
+
+(*
+   GetDumpGimple - return TRUE if the dump gimple flag is set from SetM2Dump.
+*)
+
+PROCEDURE GetDumpGimple () : BOOLEAN ;
+BEGIN
+   RETURN DumpGimple
+END GetDumpGimple ;
+
+
+(*
+   GetDumpQuad - return TRUE if the dump quad flag is set from SetM2Dump.
+*)
+
+PROCEDURE GetDumpQuad () : BOOLEAN ;
+BEGIN
+   RETURN DumpQuad
+END GetDumpQuad ;
+
+
+(*
+   GetDumpDecl - return TRUE if the dump decl flag is set from SetM2Dump.
+*)
+
+PROCEDURE GetDumpDecl () : BOOLEAN ;
+BEGIN
+   RETURN DumpDecl
+END GetDumpDecl ;
+
+
+(*
+   GetDumpLangGimple - return TRUE if the gimple flag is set from SetM2Dump.
+*)
+
+PROCEDURE GetDumpGimple () : BOOLEAN ;
+BEGIN
+   RETURN DumpGimple
+END GetDumpGimple ;
 
 
 BEGIN
@@ -1931,7 +2038,7 @@ BEGIN
    Quiet                             :=  TRUE ;
    CC1Quiet                          :=  TRUE ;
    Profiling                         := FALSE ;
-   DumpLangQuad                      := FALSE ;
+   DumpQuad                          := FALSE ;
    OptimizeBasicBlock                := FALSE ;
    OptimizeUncalledProcedures        := FALSE ;
    OptimizeCommonSubExpressions      := FALSE ;
@@ -1994,11 +2101,12 @@ BEGIN
    InitializeLongDoubleFlags ;
    M2Prefix                          := InitString ('') ;
    M2PathName                        := InitString ('') ;
-   DumpLangQuadFilename              := NIL ;
-   DumpLangGimpleFilename            := NIL ;
-   DumpLangDeclFilename              := NIL ;
-   DumpLangDecl                      := FALSE ;
-   DumpLangQuad                      := FALSE ;
-   DumpLangGimple                    := FALSE ;
+   DumpQuadFilename                  := NIL ;
+   DumpGimpleFilename                := NIL ;
+   DumpDeclFilename                  := NIL ;
+   DumpDecl                          := FALSE ;
+   DumpQuad                          := FALSE ;
+   DumpGimple                        := FALSE ;
+   M2Dump                            := NIL ;
    M2DumpFilter                      := NIL
 END M2Options.
diff --git a/gcc/m2/gm2-compiler/M2Quads.mod b/gcc/m2/gm2-compiler/M2Quads.mod
index 17d7aabc10a..68b91201702 100644
--- a/gcc/m2/gm2-compiler/M2Quads.mod
+++ b/gcc/m2/gm2-compiler/M2Quads.mod
@@ -222,7 +222,7 @@ FROM M2Options IMPORT NilChecking,
                       ScaffoldMain, SharedFlag, WholeProgram,
                       GetDumpDir, GetM2DumpFilter,
                       GetRuntimeModuleOverride, GetDebugTraceQuad,
-                      DumpLangQuad ;
+                      GetDumpQuad ;
 
 FROM M2LangDump IMPORT CreateDumpQuad, CloseDumpQuad, GetDumpFile ;
 FROM M2Pass IMPORT IsPassCodeGeneration, IsNoPass ;
@@ -276,7 +276,7 @@ IMPORT M2Error, FIO, SFIO, DynamicStrings, StdIO ;
 CONST
    DebugStackOn = TRUE ;
    DebugVarients = FALSE ;
-   BreakAtQuad = 189 ;
+   BreakAtQuad = 140 ;
    DebugTokPos = FALSE ;
 
 TYPE
@@ -7794,7 +7794,7 @@ BEGIN
    ELSIF IsAModula2Type (ProcSym)
    THEN
       ManipulatePseudoCallParameters ;
-      BuildTypeCoercion
+      BuildTypeCoercion (ConstExpr)
    ELSIF IsPseudoSystemFunction (ProcSym) OR
          IsPseudoBaseFunction (ProcSym)
    THEN
@@ -7942,7 +7942,7 @@ END BuildConstFunctionCall ;
                        differ.
 *)
 
-PROCEDURE BuildTypeCoercion ;
+PROCEDURE BuildTypeCoercion (ConstExpr: BOOLEAN) ;
 VAR
    resulttok,
    proctok,
@@ -7964,18 +7964,24 @@ BEGIN
    THEN
       PopTrwtok (exp, r, exptok) ;
       MarkAsRead (r) ;
-      resulttok := MakeVirtualTok (proctok, proctok, exptok) ;
-      ReturnVar := MakeTemporary (resulttok, RightValue) ;
-      PutVar (ReturnVar, ProcSym) ;  (* Set ReturnVar's TYPE.  *)
+      resulttok := MakeVirtual2Tok (proctok, exptok) ;
       PopN (1) ;   (* Pop procedure.  *)
-      IF IsConst (exp) OR IsVar (exp)
+      IF ConstExprError (ProcSym, exp, exptok, ConstExpr)
       THEN
+         ReturnVar := MakeTemporary (resulttok, ImmediateValue) ;
+         PutVar (ReturnVar, ProcSym) ;  (* Set ReturnVar's TYPE.  *)
+      ELSIF IsConst (exp) OR IsVar (exp)
+      THEN
+         ReturnVar := MakeTemporary (resulttok, AreConstant (IsConst (exp))) ;
+         PutVar (ReturnVar, ProcSym) ;  (* Set ReturnVar's TYPE.  *)
          GenQuad (CoerceOp, ReturnVar, ProcSym, exp)
       ELSE
          MetaError2 ('trying to coerse {%1EMRad} which is not a variable or 
constant into {%2ad}',
                      exp, ProcSym) ;
          MetaError2 ('trying to coerse {%1ECad} which is not a variable or 
constant into {%2ad}',
-                     exp, ProcSym)
+                     exp, ProcSym) ;
+         ReturnVar := MakeTemporary (resulttok, RightValue) ;
+         PutVar (ReturnVar, ProcSym)   (* Set ReturnVar's TYPE.  *)
       END ;
       PushTFtok (ReturnVar, ProcSym, resulttok)
    ELSE
@@ -9632,7 +9638,7 @@ BEGIN
             PushTFtok (Type, NulSym, typetok) ;
             PushTtok (Exp, exptok) ;
             PushT (1) ;          (* one parameter *)
-            BuildTypeCoercion
+            BuildTypeCoercion (ConstExpr)
          ELSIF IsVar (Exp) OR IsProcedure (Exp)
          THEN
             PopN (NoOfParam + 1) ;
@@ -11737,7 +11743,7 @@ BEGIN
    Assert (GetSType (Sym) = Type) ;
    ti := calculateMultipicand (indexTok, Sym, Type, Dim) ;
    idx := OperandT (1) ;
-   IF IsConst (idx)
+   IF IsConst (idx) AND IsConst (ti)
    THEN
       (* tj has no type since constant *)
       tj := MakeTemporary (indexTok, ImmediateValue) ;
@@ -13708,7 +13714,7 @@ END DumpQuadrupleAll ;
 
 PROCEDURE DumpQuadruples (title: ARRAY OF CHAR) ;
 BEGIN
-   IF DumpLangQuad
+   IF GetDumpQuad ()
    THEN
       CreateDumpQuad (title) ;
       IF GetM2DumpFilter () = NIL
diff --git a/gcc/m2/gm2-compiler/PCSymBuild.mod 
b/gcc/m2/gm2-compiler/PCSymBuild.mod
index 9a6e8c06e70..6d615b9a311 100644
--- a/gcc/m2/gm2-compiler/PCSymBuild.mod
+++ b/gcc/m2/gm2-compiler/PCSymBuild.mod
@@ -39,7 +39,7 @@ FROM M2Quads IMPORT PushT, PopT, OperandT, PopN, PopTF, 
PushTF, IsAutoPushOn,
 
 FROM M2Options IMPORT Iso ;
 FROM StdIO IMPORT Write ;
-FROM M2System IMPORT IsPseudoSystemFunctionConstExpression ;
+FROM M2System IMPORT Cast, IsPseudoSystemFunctionConstExpression ;
 
 FROM M2Base IMPORT MixTypes,
                    ZType, RType, Char, Boolean, Val, Max, Min, Convert,
@@ -1399,7 +1399,7 @@ BEGIN
       second := PopAddress (exprStack) ;
       first := PopAddress (exprStack)
    END ;
-   IF func=Val
+   IF (func=Val) OR (func=Cast)
    THEN
       InitConvert (cast, NulSym, first, second)
    ELSIF (func=Max) OR (func=Min)
@@ -1424,7 +1424,7 @@ BEGIN
       IF Iso
       THEN
          ErrorFormat0 (NewError (functok),
-                       'the only functions permissible in a constant 
expression are: CAP, CHR, CMPLX, FLOAT, HIGH, IM, LENGTH, MAX, MIN, ODD, ORD, 
RE, SIZE, TSIZE, TRUNC, VAL and gcc builtins')
+                       'the only functions permissible in a constant 
expression are: CAP, CAST, CHR, CMPLX, FLOAT, HIGH, IM, LENGTH, MAX, MIN, ODD, 
ORD, RE, SIZE, TSIZE, TRUNC, VAL and gcc builtins')
       ELSE
          ErrorFormat0 (NewError (functok),
                        'the only functions permissible in a constant 
expression are: CAP, CHR, FLOAT, HIGH, MAX, MIN, ODD, ORD, SIZE, TSIZE, TRUNC, 
VAL and gcc builtins')
@@ -1433,7 +1433,7 @@ BEGIN
       IF Iso
       THEN
          MetaErrorT1 (functok,
-                      'the only functions permissible in a constant expression 
are: CAP, CHR, CMPLX, FLOAT, HIGH, IM, LENGTH, MAX, MIN, ODD, ORD, RE, SIZE, 
TSIZE, TRUNC, VAL and gcc builtins, but not {%1Ead}',
+                      'the only functions permissible in a constant expression 
are: CAP, CAST, CHR, CMPLX, FLOAT, HIGH, IM, LENGTH, MAX, MIN, ODD, ORD, RE, 
SIZE, TSIZE, TRUNC, VAL and gcc builtins, but not {%1Ead}',
                       func)
       ELSE
          MetaErrorT1 (functok,
diff --git a/gcc/m2/gm2-compiler/SymbolTable.mod 
b/gcc/m2/gm2-compiler/SymbolTable.mod
index fc1cb74c866..13ee1fb6fe3 100644
--- a/gcc/m2/gm2-compiler/SymbolTable.mod
+++ b/gcc/m2/gm2-compiler/SymbolTable.mod
@@ -5082,27 +5082,6 @@ BEGIN
 END InitConstString ;
 
 
-(*
-   GetConstString - returns the contents of a string constant.
-*)
-
-PROCEDURE GetConstStringContent (sym: CARDINAL) : Name ;
-VAR
-   pSym: PtrToSymbol ;
-BEGIN
-   pSym := GetPsym (sym) ;
-   WITH pSym^ DO
-      CASE SymbolType OF
-
-      ConstStringSym:  RETURN ConstString.Contents
-
-      ELSE
-         InternalError ('expecting ConstStringSym')
-      END
-   END
-END GetConstStringContent ;
-
-
 (*
    IsConstStringNulTerminated - returns TRUE if the constant string, sym,
                                 should be created with a nul terminator.
diff --git a/gcc/m2/gm2-gcc/m2decl.cc b/gcc/m2/gm2-gcc/m2decl.cc
index 2dd28067a3d..d8a2bc898d0 100644
--- a/gcc/m2/gm2-gcc/m2decl.cc
+++ b/gcc/m2/gm2-gcc/m2decl.cc
@@ -152,11 +152,11 @@ m2decl_DeclareKnownConstant (location_t location, tree 
type, tree value)
 
   decl = build_decl (location, CONST_DECL, id, type);
 
+  value = copy_node (value);
+  TREE_TYPE (value) = type;
   DECL_INITIAL (decl) = value;
   TREE_TYPE (decl) = type;
-
   decl = m2block_global_constant (decl);
-
   return decl;
 }
 
diff --git a/gcc/m2/gm2-gcc/m2options.h b/gcc/m2/gm2-gcc/m2options.h
index 363b2605e9e..bf077735797 100644
--- a/gcc/m2/gm2-gcc/m2options.h
+++ b/gcc/m2/gm2-gcc/m2options.h
@@ -155,16 +155,17 @@ EXTERN void M2Options_SetIBMLongDouble (bool value);
 EXTERN bool M2Options_GetIBMLongDouble (void);
 EXTERN void M2Options_SetIEEELongDouble (bool value);
 EXTERN bool M2Options_GetIEEELongDouble (void);
-EXTERN bool M2Options_GetDumpLangDeclFilename (void);
-EXTERN void M2Options_SetDumpLangDeclFilename (bool value, const char *arg);
-EXTERN bool M2Options_GetDumpLangQuadFilename (void);
-EXTERN void M2Options_SetDumpLangQuadFilename (bool value, const char *arg);
-EXTERN bool M2Options_GetDumpLangGimpleFilename (void);
-EXTERN void M2Options_SetDumpLangGimpleFilename (bool value, const char *arg);
-EXTERN bool M2Options_GetDumpLangGimple (void);
+EXTERN bool M2Options_GetDumpDeclFilename (void);
+EXTERN void M2Options_SetDumpDeclFilename (bool value, const char *arg);
+EXTERN bool M2Options_GetDumpQuadFilename (void);
+EXTERN void M2Options_SetDumpQuadFilename (bool value, const char *arg);
+EXTERN bool M2Options_GetDumpGimpleFilename (void);
+EXTERN void M2Options_SetDumpGimpleFilename (bool value, const char *arg);
 EXTERN void M2Options_SetM2DumpFilter (bool value, const char *args);
 EXTERN char *M2Options_GetM2DumpFilter (void);
 EXTERN void M2Options_SetM2DebugTraceFilter (bool value, const char *arg);
+EXTERN bool M2Options_SetM2Dump (bool value, const char *arg);
+EXTERN bool M2Options_GetDumpGimple (void);
 
 #undef EXTERN
 #endif /* m2options_h.  */
diff --git a/gcc/m2/gm2-gcc/m2pp.cc b/gcc/m2/gm2-gcc/m2pp.cc
index de8015864e3..ce004b771a6 100644
--- a/gcc/m2/gm2-gcc/m2pp.cc
+++ b/gcc/m2/gm2-gcc/m2pp.cc
@@ -34,6 +34,8 @@ along with GNU Modula-2; see the file COPYING3.  If not see
 #define M2PP_C
 #include "m2pp.h"
 
+#define GM2
+
 const char *m2pp_dump_description[M2PP_DUMP_END] =
 {
   "interactive user invoked output",
@@ -526,9 +528,9 @@ m2pp_type_lowlevel (pretty *s, tree t)
 
       m2pp_needspace (s);
       if (TYPE_UNSIGNED (t))
-        m2pp_print (s, "unsigned\n");
+        m2pp_print (s, "unsigned");
       else
-        m2pp_print (s, "signed\n");
+        m2pp_print (s, "signed");
     }
 }
 
@@ -896,6 +898,19 @@ m2pp_identifier (pretty *s, tree t)
           else
             snprintf (name, 100, "D_%u", DECL_UID (t));
           m2pp_print (s, name);
+         if (TREE_TYPE (t) != NULL_TREE)
+           {
+             m2pp_needspace (s);
+             m2pp_print (s, "(* type:");
+             m2pp_needspace (s);
+             m2pp_simple_type (s, TREE_TYPE (t));
+             m2pp_needspace (s);
+#if 0
+             m2pp_type_lowlevel (s, TREE_TYPE (t));
+             m2pp_needspace (s);
+#endif
+             m2pp_print (s, "*)");
+           }
         }
     }
 }
@@ -2554,6 +2569,16 @@ m2pp_assignment (pretty *s, tree t)
   int o;
 
   m2pp_begin (s);
+
+  /* Print the types of des and expr.  */
+  m2pp_type (s, TREE_TYPE (TREE_OPERAND (t, 0)));
+  m2pp_needspace (s);
+  m2pp_print (s, ":=");
+  m2pp_needspace (s);
+  m2pp_type (s, TREE_TYPE (TREE_OPERAND (t, 1)));
+  m2pp_needspace (s);
+  m2pp_print (s, ";\n");
+  /* Print the assignment statement.  */
   m2pp_designator (s, TREE_OPERAND (t, 0));
   m2pp_needspace (s);
   m2pp_print (s, ":=");
@@ -2818,7 +2843,7 @@ m2pp_dump_gimple_pretty (m2pp_dump_kind kind, tree fndecl)
 void
 m2pp_dump_gimple (m2pp_dump_kind kind, tree fndecl)
 {
-  if (M2Options_GetDumpLangGimple ()
+  if (M2Options_GetDumpGimple ()
       && M2LangDump_IsDumpRequiredTree (fndecl, true))
     m2pp_dump_gimple_pretty (kind, fndecl);
 }
diff --git a/gcc/m2/gm2-lang.cc b/gcc/m2/gm2-lang.cc
index f7ab8b807d3..e31a6c437ec 100644
--- a/gcc/m2/gm2-lang.cc
+++ b/gcc/m2/gm2-lang.cc
@@ -42,7 +42,7 @@ Free Software Foundation, 51 Franklin Street, Fifth Floor, 
Boston, MA
 #include "convert.h"
 #include "rtegraph.h"
 
-#undef ENABLE_QUAD_DUMP_ALL
+#undef ENABLE_M2DUMP_ALL
 
 static void write_globals (void);
 
@@ -478,31 +478,6 @@ gm2_langhook_handle_option (
     case OPT_fdebug_function_line_numbers:
       M2Options_SetDebugFunctionLineNumbers (value);
       return 1;
-#ifdef ENABLE_QUAD_DUMP_ALL
-    case OPT_fdump_lang_all:
-      M2Options_SetDumpLangDeclFilename (value, NULL);
-      M2Options_SetDumpLangGimpleFilename (value, NULL);
-      M2Options_SetDumpLangQuadFilename (value, NULL);
-      return 1;
-    case OPT_fdump_lang_decl:
-      M2Options_SetDumpLangDeclFilename (value, NULL);
-      return 1;
-    case OPT_fdump_lang_decl_:
-      M2Options_SetDumpLangDeclFilename (value, arg);
-      return 1;
-    case OPT_fdump_lang_gimple:
-      M2Options_SetDumpLangGimpleFilename (value, NULL);
-      return 1;
-    case OPT_fdump_lang_gimple_:
-      M2Options_SetDumpLangGimpleFilename (value, arg);
-      return 1;
-    case OPT_fdump_lang_quad:
-      M2Options_SetDumpLangQuadFilename (value, NULL);
-      return 1;
-    case OPT_fdump_lang_quad_:
-      M2Options_SetDumpLangQuadFilename (value, arg);
-      return 1;
-#endif
     case OPT_fauto_init:
       M2Options_SetAutoInit (value);
       return 1;
@@ -546,7 +521,18 @@ gm2_langhook_handle_option (
     case OPT_fm2_debug_trace_:
       M2Options_SetM2DebugTraceFilter (value, arg);
       return 1;
-#ifdef ENABLE_QUAD_DUMP_ALL
+#ifdef ENABLE_M2DUMP_ALL
+    case OPT_fm2_dump_:
+      return M2Options_SetM2Dump (value, arg);
+    case OPT_fm2_dump_decl_:
+      M2Options_SetDumpDeclFilename (value, arg);
+      return 1;
+    case OPT_fm2_dump_gimple_:
+      M2Options_SetDumpGimpleFilename (value, arg);
+      return 1;
+    case OPT_fm2_dump_quad_:
+      M2Options_SetDumpQuadFilename (value, arg);
+      return 1;
     case OPT_fm2_dump_filter_:
       M2Options_SetM2DumpFilter (value, arg);
       return 1;
diff --git a/gcc/testsuite/gm2/iso/const/pass/constcast.mod 
b/gcc/testsuite/gm2/iso/const/pass/constcast.mod
new file mode 100644
index 00000000000..21ffd47b44b
--- /dev/null
+++ b/gcc/testsuite/gm2/iso/const/pass/constcast.mod
@@ -0,0 +1,8 @@
+MODULE constcast ;
+
+FROM SYSTEM IMPORT CAST ;
+
+CONST Nil = CAST (PROC, NIL) ;
+
+BEGIN
+END constcast.
\ No newline at end of file
diff --git a/gcc/testsuite/gm2/iso/const/pass/constodd.mod 
b/gcc/testsuite/gm2/iso/const/pass/constodd.mod
new file mode 100644
index 00000000000..58f5be8bad7
--- /dev/null
+++ b/gcc/testsuite/gm2/iso/const/pass/constodd.mod
@@ -0,0 +1,16 @@
+MODULE constodd ;
+
+FROM libc IMPORT printf, exit ;
+
+CONST
+   IsOdd = ODD (1) AND (2 > 1) ;
+
+BEGIN
+   IF IsOdd
+   THEN
+      printf ("success\n");
+   ELSE
+      printf ("failure\n");
+      exit (1)
+   END
+END constodd.
diff --git a/gcc/testsuite/gm2/pim/pass/tinyindr.mod 
b/gcc/testsuite/gm2/pim/pass/tinyindr.mod
new file mode 100644
index 00000000000..c606e494ef2
--- /dev/null
+++ b/gcc/testsuite/gm2/pim/pass/tinyindr.mod
@@ -0,0 +1,24 @@
+MODULE tinyindr ;
+
+FROM SYSTEM IMPORT WORD, BYTE ;
+
+TYPE
+   File = RECORD
+             lastWord: WORD ;
+             lastByte: BYTE ;
+          END ;
+
+PROCEDURE Create (VAR f: File) ;
+BEGIN
+   WITH f DO
+      lastWord := WORD (0) ;
+      lastByte := BYTE (0)
+   END
+END Create ;
+
+
+VAR
+   foo: File ;
+BEGIN
+   Create (foo)
+END tinyindr.

Reply via email to