{"id":2223096,"url":"http://patchwork.ozlabs.org/api/patches/2223096/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/patch/20260414125122.1255659-1-gaiusmod2@gmail.com/","project":{"id":17,"url":"http://patchwork.ozlabs.org/api/projects/17/?format=json","name":"GNU Compiler Collection","link_name":"gcc","list_id":"gcc-patches.gcc.gnu.org","list_email":"gcc-patches@gcc.gnu.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260414125122.1255659-1-gaiusmod2@gmail.com>","list_archive_url":null,"date":"2026-04-14T12:51:22","name":"[pushed] PR modula2/105408 ICE in output_constructor_regular_field, at varasm.cc:5515","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"ce57bfba115f4740ffc219dac88782429a46d6ea","submitter":{"id":80961,"url":"http://patchwork.ozlabs.org/api/people/80961/?format=json","name":"Gaius Mulley","email":"gaiusmod2@gmail.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/gcc/patch/20260414125122.1255659-1-gaiusmod2@gmail.com/mbox/","series":[{"id":499833,"url":"http://patchwork.ozlabs.org/api/series/499833/?format=json","web_url":"http://patchwork.ozlabs.org/project/gcc/list/?series=499833","date":"2026-04-14T12:51:22","name":"[pushed] PR modula2/105408 ICE in output_constructor_regular_field, at varasm.cc:5515","version":1,"mbox":"http://patchwork.ozlabs.org/series/499833/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2223096/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2223096/checks/","tags":{},"related":[],"headers":{"Return-Path":"<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>","X-Original-To":["incoming@patchwork.ozlabs.org","gcc-patches@gcc.gnu.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","gcc-patches@gcc.gnu.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=DftsnPW/;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)","sourceware.org;\n\tdkim=pass (2048-bit key,\n unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256\n header.s=20251104 header.b=DftsnPW/","sourceware.org;\n dmarc=pass (p=none dis=none) header.from=gmail.com","sourceware.org; spf=pass smtp.mailfrom=gmail.com","server2.sourceware.org;\n arc=none smtp.remote-ip=209.85.128.53"],"Received":["from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fw4161q2cz1yDF\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 22:52:08 +1000 (AEST)","from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id D10304BA2E09\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 12:52:06 +0000 (GMT)","from mail-wm1-f53.google.com (mail-wm1-f53.google.com\n [209.85.128.53])\n by sourceware.org (Postfix) with ESMTPS id A4F6B4BA2E09\n for <gcc-patches@gcc.gnu.org>; Tue, 14 Apr 2026 12:51:32 +0000 (GMT)","by mail-wm1-f53.google.com with SMTP id\n 5b1f17b1804b1-4887ca8e529so36516105e9.0\n for <gcc-patches@gcc.gnu.org>; Tue, 14 Apr 2026 05:51:32 -0700 (PDT)","from gawain ([82.153.81.65]) by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-488eddba112sm52525455e9.0.2026.04.14.05.51.30\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 14 Apr 2026 05:51:30 -0700 (PDT)","from gaius by gawain with local (Exim 4.98.2)\n (envelope-from <gaius@gawain>) id 1wCdEn-00000005Gen-2DXv;\n Tue, 14 Apr 2026 13:51:29 +0100"],"DKIM-Filter":["OpenDKIM Filter v2.11.0 sourceware.org D10304BA2E09","OpenDKIM Filter v2.11.0 sourceware.org A4F6B4BA2E09"],"DMARC-Filter":"OpenDMARC Filter v1.4.2 sourceware.org A4F6B4BA2E09","ARC-Filter":"OpenARC Filter v1.0.0 sourceware.org A4F6B4BA2E09","ARC-Seal":"i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776171092; cv=none;\n b=wf2onQcGOG+lygYTeXcL1mThQ506rHmOJjSR7PrgCkNCMSmtYBhTb4UtESuXoC4jzt3n59qUAtl79PMN0BcNhY4kJYK4tfRdrqzhZ3DcvJq7VSzcEJbTGauZElq9LNizwUCiildl15an9jdHpPCK+FOMBr3yI2GLEyvezemO0Ag=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776171092; c=relaxed/simple;\n bh=IK3ZR8AVmU19J76k02CQIusCC6+LKgIPoHl2Gn7TKtg=;\n h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version;\n b=BEhISjB0JTwod+4d2wvAb8u2XzEN2HO4IjAHREb74qY+sV6QyGhUR645Dq/EfpAipV8Woy2CPWZtZBLJpS70WGh32i7RSc+hQicvL3UtGsvFe858bKmLdDY5NsmuBdaMVkjgT0qxBHMojAD2uBqV3Cf9JafL5KN3FDuOHJdth1Y=","ARC-Authentication-Results":"i=1; server2.sourceware.org","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=gmail.com; s=20251104; t=1776171091; x=1776775891; darn=gcc.gnu.org;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:from:to:cc:subject:date:message-id:reply-to;\n bh=1YW9fFHgOBMlFJaU0ZbyQmsbh/9NRaEuM0JlbmkW158=;\n b=DftsnPW/10Osls8K7U4VJekaXD3kczVe2Kex9EAFzLPDVWXBsAI62223WCAxx5Y2OG\n lleukRJgeCCbbGTHdNMtC2LlHXytwFc94s79if0eq9mWrdh8p6CfacwqlVwm9+vgk1Bs\n Qhmjly37AVmCfa3zqVsKN54hokZP/pTBPrZOFTvzO87Ja3jDt/esRKxE8RNlG56++g//\n Kqp4BmX/UCcJ1mTtMze13K5Dl3lyGSgejjQdAvayThwlT6IyJuW5G5gKcpQttOfFdrc6\n Wlp9DUSs4CMdyCuKK65ot1SvH1zkFMuGo/N3mfNwH6bUv7GmDXfko4+FkWF56oPj3xXW\n pCHA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776171091; x=1776775891;\n h=content-transfer-encoding:mime-version:message-id:date:subject:cc\n :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=1YW9fFHgOBMlFJaU0ZbyQmsbh/9NRaEuM0JlbmkW158=;\n b=nCiKg1veD/qW5RYIpuyZIatdxVY9qBwTEqJE0oENOvmYWU97yH5CYcWx4ktesC2CfS\n wtsKlzkKppMew8g6R+8YkJnX2MPEItLFx/JWORxewT8LAVL1dVwtIrouiX0FtbpFhdpY\n rzRKahMwG0PpQZnoMv9zg9/I96leD+Zc+m3fj0AtgrHvb1SubVefLjJ3+Ekaw98QbJj3\n XNiwTPoTgR6/SQzkelgY7V4J9kdMIIFOZ5sIqBZP4KK7B8xGgfFwXFkwXHaQj/QfRBK9\n WJfnTeMZWZNHXMJPXvGGYdPzgxmCyhmeejhC2aX00N+uhN+sj7aGrDzEdsl1ACUTlaTL\n qoDQ==","X-Gm-Message-State":"AOJu0YzGj51dg0gWh2jqeH+v5aBYS9dEafnLOC56Elr4+PntdRQ1lyAj\n Xna3KR4ub0CK6IZ5y8MZtTGAXW88O1DSuGTBt4awfec9razfSQ5Oz5V9RbfNKg==","X-Gm-Gg":"AeBDietQ0JbtATmMI29CFDme9OHVimZbze4Okqgogb9pNObWt277bvWgWDs4hGij53C\n LG1oma6MVkBPKECJnjI897C3NM+aunImITf6M5qr2oereXQ3lGGILGU3PlVfffk1rZRiqbSKAed\n EHL0DJPedSjQEpt3J9dJctw8ZMqzxlJWyiDqbuE0XIYZSNZ1pVrKr/7DELeOLvqRE8Ao7A4RhMU\n F+ar4uchI0QYIXjMpwtkHo538UwnD9eRdXiDFz1ZK11CiU4+6HrLG/OY7Px8iJ7pHaOjhQeEQC9\n /UeKwwB0+UyrMlxPxyJLkNYFfjAbyPR8CBdKxTI/j+jatYHm0C4LzmUc6fVgtkr1iI0xKkG64la\n 6pgr6lnBYjbMDbSDHxmk17iJcqiaJN/FdQrneOaV/udiQK6qY3Gf4kNAzIRnDDsMpxUsp3AhLKB\n vI/EQ=","X-Received":"by 2002:a05:600c:4ecb:b0:485:3cef:d6ea with SMTP id\n 5b1f17b1804b1-488dc76d45amr204037805e9.13.1776171091018;\n Tue, 14 Apr 2026 05:51:31 -0700 (PDT)","From":"Gaius Mulley <gaiusmod2@gmail.com>","To":"gcc-patches@gcc.gnu.org","Cc":"Gaius Mulley <gaiusmod2@gmail.com>","Subject":"[pushed]PR modula2/105408 ICE in output_constructor_regular_field,\n at varasm.cc:5515","Date":"Tue, 14 Apr 2026 13:51:22 +0100","Message-ID":"<20260414125122.1255659-1-gaiusmod2@gmail.com>","X-Mailer":"git-send-email 2.47.3","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","X-BeenThere":"gcc-patches@gcc.gnu.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"Gcc-patches mailing list <gcc-patches.gcc.gnu.org>","List-Unsubscribe":"<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>","List-Archive":"<https://gcc.gnu.org/pipermail/gcc-patches/>","List-Post":"<mailto:gcc-patches@gcc.gnu.org>","List-Help":"<mailto:gcc-patches-request@gcc.gnu.org?subject=help>","List-Subscribe":"<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>","Errors-To":"gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org"},"content":"This patch fixes an ICE reported as PR modula2/105408.  It manifests on\nbig endian system when an ISO WORD is assigned a constant.  An ISO WORD\nis an array of LOC and the constant array elements are created in reverse\nindice order (for big endian).  This fix corrects the indice order and\nalso fixes calls to builtin_memcpy when used during assignment.  It uses\nmemcpy during assignment for arrays of constants.\nBootstrapped on sparc64, aarch64, x86_64 and POWER10.\n\ngcc/m2/ChangeLog:\n\n\tPR modula2/105408\n\t* Make-lang.in (GM2-COMP-BOOT-MODS): Remove duplicate NameKey.mod.\n\t* gm2-compiler/M2GenGCC.mod (import): Remove BuildAssignmentTree.\n\tAdd CopyMemcpy.\n\t(IsSystemTypeBecomes): New procedure function.\n\t(CodeAssignment): Rewrite using CopyMemcpy and IsSystemTypeBecomes.\n\t* gm2-gcc/m2convert.cc (const_to_ISO_aggregate_type): Reverse\n\tarray elements if BYTES_BIG_ENDIAN.\n\t* gm2-gcc/m2pp.cc (ps): New function.\n\t* gm2-gcc/m2pp.h (pf): Added comment.\n\t(pe): Ditto.\n\t(pt): Ditto.\n\t(ptl): Ditto.\n\t(pv): Ditto.\n\t(ptcl): Ditto.\n\t* gm2-gcc/m2statement.cc (copy_memcpy): Replace with ...\n\t(m2statement_CopyMemcpy): ... this.\n\t(CopyByField_Lower): Call m2statement_CopyMemcpy instead of copy_memcpy.\n\t(m2statement_BuildAssignmentTree): Tidied up comment.\n\tAdd test for ARRAY_TYPE CONSTRUCTOR expr and use\n\tm2statement_CopyMemcpy.\n\tReturn type changed to void.\n\t* gm2-gcc/m2statement.def (BuildAssignmentTree): Rewrite declaration.\n\t(CopyMemcpy): New procedure declaration.\n\t* gm2-gcc/m2statement.h (m2statement_BuildAssignmentTree): Replace\n\treturn type with void.\n\t(m2statement_CopyMemcpy): New function declaration.\n\t* gm2-gcc/m2type.cc (m2type_ReverseArrayConstructorElements): New\n\tfunction.\n\t* gm2-gcc/m2type.def (ReverseArrayConstructorElements): New\n\tprocedure function declaration.\n\t* gm2-gcc/m2type.h (m2type_ReverseArrayConstructorElements): New\n\tfunction declaration.\n\ngcc/testsuite/ChangeLog:\n\n\tPR modula2/105408\n\t* gm2/iso/run/pass/testgeneric.mod: Corrected printf arguments.\n\t* gm2/iso/run/pass/printsize.mod: New test.\n\t* gm2/iso/run/pass/testgeneric2.mod: New test.\n\t* gm2/iso/run/pass/testgeneric3.mod: New test.\n\t* gm2/iso/run/pass/testgeneric4.mod: New test.\n\t* gm2/iso/run/pass/testgeneric5.mod: New test.\n\nSigned-off-by: Gaius Mulley <gaiusmod2@gmail.com>\n---\n gcc/m2/Make-lang.in                           |  1 -\n gcc/m2/gm2-compiler/M2GenGCC.mod              | 47 +++++++++-------\n gcc/m2/gm2-gcc/m2convert.cc                   |  4 +-\n gcc/m2/gm2-gcc/m2pp.cc                        | 13 +++++\n gcc/m2/gm2-gcc/m2pp.h                         | 24 +++++---\n gcc/m2/gm2-gcc/m2statement.cc                 | 38 ++++++++-----\n gcc/m2/gm2-gcc/m2statement.def                | 15 +++--\n gcc/m2/gm2-gcc/m2statement.h                  |  3 +-\n gcc/m2/gm2-gcc/m2type.cc                      | 13 +++++\n gcc/m2/gm2-gcc/m2type.def                     |  8 +++\n gcc/m2/gm2-gcc/m2type.h                       |  1 +\n gcc/testsuite/gm2/iso/run/pass/printsize.mod  | 10 ++++\n .../gm2/iso/run/pass/testgeneric.mod          |  5 +-\n .../gm2/iso/run/pass/testgeneric2.mod         |  9 +++\n .../gm2/iso/run/pass/testgeneric3.mod         | 55 +++++++++++++++++++\n .../gm2/iso/run/pass/testgeneric4.mod         | 29 ++++++++++\n .../gm2/iso/run/pass/testgeneric5.mod         | 29 ++++++++++\n 17 files changed, 249 insertions(+), 55 deletions(-)\n create mode 100644 gcc/testsuite/gm2/iso/run/pass/printsize.mod\n create mode 100644 gcc/testsuite/gm2/iso/run/pass/testgeneric2.mod\n create mode 100644 gcc/testsuite/gm2/iso/run/pass/testgeneric3.mod\n create mode 100644 gcc/testsuite/gm2/iso/run/pass/testgeneric4.mod\n create mode 100644 gcc/testsuite/gm2/iso/run/pass/testgeneric5.mod","diff":"diff --git a/gcc/m2/Make-lang.in b/gcc/m2/Make-lang.in\nindex 317917e26a8..11079927eb8 100644\n--- a/gcc/m2/Make-lang.in\n+++ b/gcc/m2/Make-lang.in\n@@ -902,7 +902,6 @@ GM2-COMP-BOOT-MODS = \\\n    M2SymInit.mod \\\n    M2System.mod \\\n    NameKey.mod \\\n-   NameKey.mod \\\n    ObjectFiles.mod \\\n    Output.mod \\\n    P0SymBuild.mod \\\ndiff --git a/gcc/m2/gm2-compiler/M2GenGCC.mod b/gcc/m2/gm2-compiler/M2GenGCC.mod\nindex c98457614a6..7877b04b803 100644\n--- a/gcc/m2/gm2-compiler/M2GenGCC.mod\n+++ b/gcc/m2/gm2-compiler/M2GenGCC.mod\n@@ -236,7 +236,7 @@ FROM m2statement IMPORT BuildAsm, BuildProcedureCallTree, BuildParam, BuildFunct\n                         BuildGoto, BuildCall2, BuildCall3,\n                         BuildStart, BuildEnd, BuildCallInner, BuildStartFunctionCode,\n                         BuildEndFunctionCode,\n-                        BuildAssignmentTree, DeclareLabel,\n+                        DeclareLabel,\n                         BuildFunctionCallTree,\n                         BuildAssignmentStatement,\n                         BuildIndirectProcedureCallTree,\n@@ -248,7 +248,8 @@ FROM m2statement IMPORT BuildAsm, BuildProcedureCallTree, BuildParam, BuildFunct\n \t\t\tGetParamTree, BuildCleanUp,\n \t\t\tBuildTryFinally,\n \t\t\tGetLastFunction, SetLastFunction,\n-                        SetBeginLocation, SetEndLocation ;\n+                        SetBeginLocation, SetEndLocation,\n+\t\t\tCopyMemcpy ;\n \n FROM m2type IMPORT ChainOnParamValue, GetPointerType, GetIntegerType, AddStatement,\n                    GetCardinalType, GetWordType, GetM2ZType, GetM2RType, GetM2CType,\n@@ -3526,7 +3527,7 @@ BEGIN\n    exprtree := FoldConstBecomes (virtpos, des, expr) ;\n    IF IsVar (des) AND IsVariableSSA (des)\n    THEN\n-      Replace (des, exprtree)\n+\tReplace (des, exprtree)\n    ELSIF IsGccStrictTypeEquivalent (destree, exprtree)\n    THEN\n       BuildAssignmentStatement (location, destree, exprtree)\n@@ -3536,6 +3537,25 @@ BEGIN\n END PerformCodeBecomes ;\n \n \n+(*\n+   IsSystemTypeBecomes - return TRUE if expr should be copied using\n+                         memcpy into des.   If des or expr are generic\n+                         system types and expr is not constant then\n+                         this is true.\n+*)\n+\n+PROCEDURE IsSystemTypeBecomes (des, expr: CARDINAL) : BOOLEAN ;\n+BEGIN\n+   RETURN (((IsGenericSystemType (SkipType (GetType (des))) #\n+             IsGenericSystemType (SkipType (GetType (expr)))) OR\n+            (IsUnbounded (SkipType (GetType (des))) AND\n+             IsUnbounded (SkipType (GetType (expr))) AND\n+             (IsGenericSystemType (SkipType (GetType (GetType (des)))) #\n+              IsGenericSystemType (SkipType (GetType (GetType (expr))))))) AND\n+\t   (NOT IsConstant (expr)))\n+END IsSystemTypeBecomes ;\n+\n+\n (*\n ------------------------------------------------------------------------------\n    := Operator\n@@ -3592,26 +3612,13 @@ BEGIN\n                            'string constant {%1Ea} is too large to be assigned to the array {%2ad}',\n                            expr, des, TRUE)\n       END ;\n-      AddStatement (location,\n-                    MaybeDebugBuiltinMemcpy (location,\n-                                             BuildAddr (location, Mod2Gcc (des), FALSE),\n-                                             BuildAddr (location, exprt, FALSE),\n-                                             length))\n+      CopyMemcpy (location, Mod2Gcc (des), exprt, FindSize (virtpos, des))\n    ELSE\n-      IF ((IsGenericSystemType(SkipType(GetType(des))) #\n-           IsGenericSystemType(SkipType(GetType(expr)))) OR\n-          (IsUnbounded(SkipType(GetType(des))) AND\n-           IsUnbounded(SkipType(GetType(expr))) AND\n-           (IsGenericSystemType(SkipType(GetType(GetType(des)))) #\n-            IsGenericSystemType(SkipType(GetType(GetType(expr))))))) AND\n-         (NOT IsConstant(expr))\n+      IF IsSystemTypeBecomes (des, expr)\n       THEN\n          checkDeclare (des) ;\n-         AddStatement (location,\n-                       MaybeDebugBuiltinMemcpy (location,\n-                                                BuildAddr(location, Mod2Gcc (des), FALSE),\n-                                                BuildAddr(location, Mod2Gcc (expr), FALSE),\n-                                                BuildSize(location, Mod2Gcc (des), FALSE)))\n+\t CopyMemcpy (location, Mod2Gcc (des), Mod2Gcc (expr),\n+\t\t     FindSize (virtpos, des))\n       ELSE\n          IF checkBecomes (des, expr, virtpos, despos, exprpos)\n          THEN\ndiff --git a/gcc/m2/gm2-gcc/m2convert.cc b/gcc/m2/gm2-gcc/m2convert.cc\nindex 9971927743c..ad59f48f9df 100644\n--- a/gcc/m2/gm2-gcc/m2convert.cc\n+++ b/gcc/m2/gm2-gcc/m2convert.cc\n@@ -563,7 +563,9 @@ const_to_ISO_aggregate_type (location_t location, tree expr, tree iso_type)\n       expr = m2expr_BuildDivFloor (location, expr,\n                                    m2decl_BuildIntegerConstant (256), false);\n     }\n-\n+  /* Array contents must be in indice order.  */\n+  if (BYTES_BIG_ENDIAN)\n+    m2type_ReverseArrayConstructorElements (c);\n   return m2type_BuildEndArrayConstructor (c);\n }\n \ndiff --git a/gcc/m2/gm2-gcc/m2pp.cc b/gcc/m2/gm2-gcc/m2pp.cc\nindex 7ca7d6e5a8a..9af7be4722e 100644\n--- a/gcc/m2/gm2-gcc/m2pp.cc\n+++ b/gcc/m2/gm2-gcc/m2pp.cc\n@@ -334,6 +334,19 @@ m2pp_decl_bool (pretty *s, tree t)\n     m2pp_print (s, \"in bind expr, \");\n }\n \n+/* Print statement stmt.  */\n+\n+void\n+ps (tree stmt)\n+{\n+  if (stmt)\n+    {\n+      pretty *state = initPretty (M2PP_DUMP_STDOUT, 0);\n+      m2pp_statement (state, stmt);\n+      killPretty (state);\n+    }\n+}\n+\n void\n pv (tree t)\n {\ndiff --git a/gcc/m2/gm2-gcc/m2pp.h b/gcc/m2/gm2-gcc/m2pp.h\nindex 6d5072bf81a..0a1e9ab0172 100644\n--- a/gcc/m2/gm2-gcc/m2pp.h\n+++ b/gcc/m2/gm2-gcc/m2pp.h\n@@ -50,15 +50,23 @@ EXTERN void m2pp_CloseDumpGimple (void);\n EXTERN void m2pp_DumpGimpleFd (int fd, tree fndecl);\n \n namespace modula2 {\n-/* GDB Interactive interface to m2pp.  Allow a maintainer to dump\n-   the trees in Modula-2.  */\n+  /* GDB Interactive interface to m2pp.  Allow a maintainer to dump\n+     the trees in Modula-2.  */\n \n-EXTERN void pf (tree t);\n-EXTERN void pe (tree t);\n-EXTERN void pt (tree t);\n-EXTERN void ptl (tree t);\n-EXTERN void pv (tree t);\n-EXTERN void ptcl (tree t);\n+  /* pf print function in Modula-2 syntax.  */\n+  EXTERN void pf (tree t);\n+  /* pe print expression.  */  \n+  EXTERN void pe (tree t);\n+  /* pt print type.  */    \n+  EXTERN void pt (tree t);\n+  /* ptl print type with low level detail.  */\n+  EXTERN void ptl (tree t);\n+  /* pv print variable and type declaration.  */\n+  EXTERN void pv (tree t);\n+  /* ptcl print chained list.  */\n+  EXTERN void ptcl (tree t);\n+  /* Print statement stmt.  */\n+  EXTERN void ps (tree stmt);\n }\n \n #   undef EXTERN\ndiff --git a/gcc/m2/gm2-gcc/m2statement.cc b/gcc/m2/gm2-gcc/m2statement.cc\nindex 9f71b8e187b..e1d227a0d66 100644\n--- a/gcc/m2/gm2-gcc/m2statement.cc\n+++ b/gcc/m2/gm2-gcc/m2statement.cc\n@@ -214,19 +214,19 @@ copy_strncpy (location_t location, tree left, tree cst)\n   add_stmt (location, result);\n }\n \n-/* copy_memcpy copy right into left using builtin_memcpy.  */\n+/* CopyMemcpy copy bytes from src into dest using builtin_memcpy.  */\n \n-static\n void\n-copy_memcpy (location_t location, tree left, tree right)\n+m2statement_CopyMemcpy (location_t location, tree dest, tree src, tree bytes)\n {\n+  tree addr_dest = m2expr_BuildAddr (location, dest, false);\n   tree result = m2builtins_BuiltinMemCopy (location,\n-\t\t\t\t\t   m2expr_BuildAddr (location, left, false),\n-\t\t\t\t\t   m2expr_BuildAddr (location, right, false),\n-\t\t\t\t\t   m2expr_GetSizeOf (location, left));\n+\t\t\t\t\t   addr_dest,\n+\t\t\t\t\t   m2expr_BuildAddr (location, src, false),\n+\t\t\t\t\t   bytes);\n   TREE_SIDE_EFFECTS (result) = true;\n-  TREE_USED (left) = true;\n-  TREE_USED (right) = true;\n+  TREE_USED (dest) = true;\n+  TREE_USED (src) = true;\n   add_stmt (location, result);\n }\n \n@@ -249,7 +249,8 @@ CopyByField_Lower (location_t location,\n   else if (left_code == ARRAY_TYPE && right_code == CONSTRUCTOR)\n     copy_array (location, left, right);\n   else if (left_code == UNION_TYPE && right_code == CONSTRUCTOR)\n-    copy_memcpy (location, left, right);\n+    m2statement_CopyMemcpy (location, left, right,\n+\t\t\t    m2expr_GetSizeOf (location, left));\n   else if (right_code == STRING_CST)\n     copy_strncpy (location, left, right);\n   else\n@@ -269,10 +270,10 @@ m2statement_CopyByField (location_t location, tree des, tree expr)\n     CopyByField_Lower (location, des, expr);\n }\n \n-/* BuildAssignmentTree builds the assignment of, des, and, expr.\n-   It returns, des.  */\n+/* BuildAssignmentTree builds the assignment of des and expr.\n+   It returns des.  */\n \n-tree\n+void\n m2statement_BuildAssignmentTree (location_t location, tree des, tree expr)\n {\n   tree result;\n@@ -286,7 +287,15 @@ m2statement_BuildAssignmentTree (location_t location, tree des, tree expr)\n   else\n     {\n       gcc_assert (TREE_CODE (TREE_TYPE (des)) != TYPE_DECL);\n-      if (TREE_TYPE (expr) == TREE_TYPE (des))\n+      if ((TREE_CODE (expr) == CONSTRUCTOR)\n+\t  && (TREE_CODE (TREE_TYPE (des)) == ARRAY_TYPE))\n+\t{\n+\t  m2statement_CopyMemcpy (location, des, expr,\n+\t\t\t\t  m2expr_GetSizeOf (location,\n+\t\t\t\t\t\t    m2type_GetTreeType (des)));\n+\t  return;\n+\t}\n+      else if (TREE_TYPE (expr) == TREE_TYPE (des))\n         result = build2 (MODIFY_EXPR, TREE_TYPE (des), des, expr);\n       else\n         result = build2 (\n@@ -298,10 +307,9 @@ m2statement_BuildAssignmentTree (location_t location, tree des, tree expr)\n   TREE_USED (des) = true;\n   TREE_USED (expr) = true;\n   add_stmt (location, result);\n-  return des;\n }\n \n-/* BuildAssignmentStatement builds the assignment of, des, and, expr.  */\n+/* BuildAssignmentStatement builds the assignment of des and expr.  */\n \n void\n m2statement_BuildAssignmentStatement (location_t location, tree des, tree expr)\ndiff --git a/gcc/m2/gm2-gcc/m2statement.def b/gcc/m2/gm2-gcc/m2statement.def\nindex a38471742dd..97bea9792b9 100644\n--- a/gcc/m2/gm2-gcc/m2statement.def\n+++ b/gcc/m2/gm2-gcc/m2statement.def\n@@ -71,14 +71,6 @@ PROCEDURE BuildPushFunctionContext ;\n PROCEDURE BuildPopFunctionContext ;\n \n \n-(*\n-   BuildAssignmentTree - builds the assignment of, des, and, expr.\n-                         It returns, des.\n-*)\n-\n-PROCEDURE BuildAssignmentTree (location: location_t; des, expr: tree) : tree ;\n-\n-\n (*\n    BuildAssignmentStatement builds the assignment of, des, and, expr.\n *)\n@@ -313,6 +305,13 @@ PROCEDURE BuildBuiltinCallTree (func: tree) : tree ;\n PROCEDURE CopyByField (location: location_t; des, expr: tree) ;\n \n \n+(*\n+   CopyMemcpy - copy bytes from src into dest using builtin_memcpy.\n+*)\n+\n+PROCEDURE CopyMemcpy (location: location_t; dest, src, bytes: tree) ;\n+\n+\n (*\n    IfBitInSetJump - if bit in set jump to label.\n *)\ndiff --git a/gcc/m2/gm2-gcc/m2statement.h b/gcc/m2/gm2-gcc/m2statement.h\nindex 9a2cfcdb9da..e431e4bca9c 100644\n--- a/gcc/m2/gm2-gcc/m2statement.h\n+++ b/gcc/m2/gm2-gcc/m2statement.h\n@@ -71,7 +71,7 @@ EXTERN tree m2statement_BuildIfThenDoEnd (tree condition, tree then_block);\n \n EXTERN void m2statement_DeclareLabel (location_t location, char *name);\n EXTERN void m2statement_BuildGoto (location_t location, char *name);\n-EXTERN tree m2statement_BuildAssignmentTree (location_t location, tree des,\n+EXTERN void m2statement_BuildAssignmentTree (location_t location, tree des,\n                                              tree expr);\n EXTERN void m2statement_BuildAssignmentStatement (location_t location, tree des,\n \t\t\t\t\t\t  tree expr);\n@@ -106,6 +106,7 @@ EXTERN tree m2statement_BuildCleanUp (tree param);\n EXTERN void m2statement_IfBitInSetJump (location_t location, bool invertCondition,\n \t\t\t\t\ttree setvalue, tree bit, char *label);\n EXTERN void m2statement_CopyByField (location_t location, tree des, tree expr);\n+EXTERN void m2statement_CopyMemcpy (location_t location, tree dest, tree src, tree bytes);\n \n #undef EXTERN\n #endif /* m2statement_h.  */\ndiff --git a/gcc/m2/gm2-gcc/m2type.cc b/gcc/m2/gm2-gcc/m2type.cc\nindex 6dd907fbae9..554573d8643 100644\n--- a/gcc/m2/gm2-gcc/m2type.cc\n+++ b/gcc/m2/gm2-gcc/m2type.cc\n@@ -2477,6 +2477,19 @@ m2type_BuildArrayConstructorElement (void *p, tree value, tree indice)\n   vec_safe_push (c->constructor_elements, celt);\n }\n \n+/* ReverseArrayConstructorElements reverse the list containing the\n+   constant array elements.  */\n+\n+void\n+m2type_ReverseArrayConstructorElements (void *p)\n+{\n+  struct struct_constructor *c = (struct struct_constructor *)p;\n+  unsigned len = vec_safe_length (c->constructor_elements);\n+  constructor_elt *ptr = c->constructor_elements->address ();\n+  for (unsigned i = 0; i < len / 2; i++)\n+    std::swap (ptr[i], ptr[len - i - 1]);\n+}\n+\n /* BuildArrayStringConstructor creates an array constructor for,\n    arrayType, consisting of the character elements defined by, str,\n    of, length, characters.  */\ndiff --git a/gcc/m2/gm2-gcc/m2type.def b/gcc/m2/gm2-gcc/m2type.def\nindex 4123f2ec697..890e048f19d 100644\n--- a/gcc/m2/gm2-gcc/m2type.def\n+++ b/gcc/m2/gm2-gcc/m2type.def\n@@ -95,6 +95,14 @@ PROCEDURE BuildArrayConstructorElement (p: ADDRESS; value: tree; indice: tree) ;\n PROCEDURE BuildEndArrayConstructor (p: Constructor) : tree ;\n \n \n+(*\n+   ReverseArrayConstructorElements - reverse the list containing the\n+                                     constant array elements.\n+*)\n+\n+PROCEDURE ReverseArrayConstructorElements (p: Constructor) ;\n+\n+\n (*\n    BuildEndArrayConstructor - returns a tree containing the array\n                               compound literal.\ndiff --git a/gcc/m2/gm2-gcc/m2type.h b/gcc/m2/gm2-gcc/m2type.h\nindex c24cc4a7ec6..101c032aa35 100644\n--- a/gcc/m2/gm2-gcc/m2type.h\n+++ b/gcc/m2/gm2-gcc/m2type.h\n@@ -215,6 +215,7 @@ EXTERN tree m2type_GetCardinalAddressType (void);\n EXTERN bool m2type_SameRealType (tree a, tree b);\n EXTERN bool m2type_IsGccStrictTypeEquivalent (tree left, tree right);\n EXTERN tree m2type_GetBooleanEnumList (location_t location);\n+EXTERN void m2type_ReverseArrayConstructorElements (void *p);\n \n #undef EXTERN\n #endif /* m2type_h  */\ndiff --git a/gcc/testsuite/gm2/iso/run/pass/printsize.mod b/gcc/testsuite/gm2/iso/run/pass/printsize.mod\nnew file mode 100644\nindex 00000000000..9d78a2cf2a0\n--- /dev/null\n+++ b/gcc/testsuite/gm2/iso/run/pass/printsize.mod\n@@ -0,0 +1,10 @@\n+MODULE printsize;\n+\n+FROM SYSTEM IMPORT WORD, WORD32 ;\n+FROM libc IMPORT printf ;\n+\t  \n+\t  \n+BEGIN\t\t\t\t(*   Module printsize Initialization Code  *)\n+     printf (\"SIZE (WORD) = %d\\n\", SIZE (WORD)) ;\n+     printf (\"SIZE (WORD32) = %d\\n\", SIZE (WORD32)) ;     \n+END printsize.\ndiff --git a/gcc/testsuite/gm2/iso/run/pass/testgeneric.mod b/gcc/testsuite/gm2/iso/run/pass/testgeneric.mod\nindex f00afbd3204..313f564074a 100644\n--- a/gcc/testsuite/gm2/iso/run/pass/testgeneric.mod\n+++ b/gcc/testsuite/gm2/iso/run/pass/testgeneric.mod\n@@ -31,7 +31,8 @@ BEGIN\n    INC (test) ;\n    IF NOT b\n    THEN\n-      printf (\"failed test %d which was %a\\n\", ADR(a)) ;\n+      printf (\"failed test %d \", test) ;\n+      printf (\"(%s)\\n\", ADR (a)) ;\n       code := 1\n    END\n END assert ;\n@@ -49,11 +50,13 @@ BEGIN\n    THEN\n       w := c ;\n       i := w ;\n+      printf (\"value of i (should be 1 after going though a variable and word) is %d\\n\", i);\n       assert (CARDINAL(i) = c, \"copying data through WORD32\")\n    END ;\n \n    w := 1 ;\n    i := w ;\n+   printf (\"value of i (should be 1, constant to word) is %d\\n\", i);\n    assert (i=1, \"assigning const into a WORD32\") ;\n    \n    exit (code)\ndiff --git a/gcc/testsuite/gm2/iso/run/pass/testgeneric2.mod b/gcc/testsuite/gm2/iso/run/pass/testgeneric2.mod\nnew file mode 100644\nindex 00000000000..1a25e361dac\n--- /dev/null\n+++ b/gcc/testsuite/gm2/iso/run/pass/testgeneric2.mod\n@@ -0,0 +1,9 @@\n+MODULE testgeneric2 ;\n+\n+FROM SYSTEM IMPORT WORD32 ;\n+\n+VAR\n+   w: WORD32 ;\n+BEGIN\n+   w := 1\n+END testgeneric2.\ndiff --git a/gcc/testsuite/gm2/iso/run/pass/testgeneric3.mod b/gcc/testsuite/gm2/iso/run/pass/testgeneric3.mod\nnew file mode 100644\nindex 00000000000..1cabd7d305a\n--- /dev/null\n+++ b/gcc/testsuite/gm2/iso/run/pass/testgeneric3.mod\n@@ -0,0 +1,55 @@\n+(* Copyright (C) 2015 Free Software Foundation, Inc. *)\n+(* This file is part of GNU Modula-2.\n+\n+GNU Modula-2 is free software; you can redistribute it and/or modify it under\n+the terms of the GNU General Public License as published by the Free\n+Software Foundation; either version 3, or (at your option) any later\n+version.\n+\n+GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY\n+WARRANTY; without even the implied warranty of MERCHANTABILITY or\n+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n+for more details.\n+\n+You should have received a copy of the GNU General Public License along\n+with gm2; see the file COPYING.  If not, write to the Free Software\n+Foundation, 51 Franklin Street, Fifth Floor,\n+Boston, MA 02110-1301, USA. *)\n+\n+MODULE testgeneric3 ;\n+\n+FROM SYSTEM IMPORT WORD32, ADR ;\n+FROM libc IMPORT printf, exit ;\n+\n+\n+VAR\n+   test: CARDINAL ;\n+   code: INTEGER ;\n+\n+PROCEDURE assert (b: BOOLEAN; a: ARRAY OF CHAR) ;\n+BEGIN\n+   INC (test) ;\n+   IF NOT b\n+   THEN\n+      printf (\"failed test %d which was %a\\n\", ADR(a)) ;\n+      code := 1\n+   END\n+END assert ;\n+\n+\n+VAR\n+   w: WORD32 ;\n+   c: CARDINAL ;\n+   i: INTEGER ;\n+BEGIN\n+   code := 0 ;\n+   test := 0 ;\n+   c := 1 ;\n+   IF SIZE(w)=SIZE(c)\n+   THEN\n+      w := c ;\n+      i := w ;\n+      assert (CARDINAL(i) = c, \"copying data through WORD32\")\n+   END ;\n+   exit (code)\n+END testgeneric3.\ndiff --git a/gcc/testsuite/gm2/iso/run/pass/testgeneric4.mod b/gcc/testsuite/gm2/iso/run/pass/testgeneric4.mod\nnew file mode 100644\nindex 00000000000..7439adcd2d8\n--- /dev/null\n+++ b/gcc/testsuite/gm2/iso/run/pass/testgeneric4.mod\n@@ -0,0 +1,29 @@\n+(* Copyright (C) 2015 Free Software Foundation, Inc. *)\n+(* This file is part of GNU Modula-2.\n+\n+GNU Modula-2 is free software; you can redistribute it and/or modify it under\n+the terms of the GNU General Public License as published by the Free\n+Software Foundation; either version 3, or (at your option) any later\n+version.\n+\n+GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY\n+WARRANTY; without even the implied warranty of MERCHANTABILITY or\n+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n+for more details.\n+\n+You should have received a copy of the GNU General Public License along\n+with gm2; see the file COPYING.  If not, write to the Free Software\n+Foundation, 51 Franklin Street, Fifth Floor,\n+Boston, MA 02110-1301, USA. *)\n+\n+MODULE testgeneric4 ;\n+\n+FROM SYSTEM IMPORT WORD32 ;\n+\n+VAR\n+   w: WORD32 ;\n+   i: INTEGER ;\n+BEGIN\n+   w := 1 ;\n+   i := w ;\n+END testgeneric4.\ndiff --git a/gcc/testsuite/gm2/iso/run/pass/testgeneric5.mod b/gcc/testsuite/gm2/iso/run/pass/testgeneric5.mod\nnew file mode 100644\nindex 00000000000..d0fccd462c3\n--- /dev/null\n+++ b/gcc/testsuite/gm2/iso/run/pass/testgeneric5.mod\n@@ -0,0 +1,29 @@\n+(* Copyright (C) 2015 Free Software Foundation, Inc. *)\n+(* This file is part of GNU Modula-2.\n+\n+GNU Modula-2 is free software; you can redistribute it and/or modify it under\n+the terms of the GNU General Public License as published by the Free\n+Software Foundation; either version 3, or (at your option) any later\n+version.\n+\n+GNU Modula-2 is distributed in the hope that it will be useful, but WITHOUT ANY\n+WARRANTY; without even the implied warranty of MERCHANTABILITY or\n+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License\n+for more details.\n+\n+You should have received a copy of the GNU General Public License along\n+with gm2; see the file COPYING.  If not, write to the Free Software\n+Foundation, 51 Franklin Street, Fifth Floor,\n+Boston, MA 02110-1301, USA. *)\n+\n+MODULE testgeneric5 ;\n+\n+FROM SYSTEM IMPORT WORD ;\n+\n+VAR\n+   w: WORD ;\n+   i: INTEGER ;\n+BEGIN\n+   w := 1 ;\n+   i := w ;\n+END testgeneric5.\n","prefixes":["pushed"]}