From d400d17ef00e6a24d69d6a36eff129f2c02ea806 Mon Sep 17 00:00:00 2001
From: Eric Botcazou <ebotcazou@adacore.com>
Date: Thu, 10 May 2012 14:57:48 +0000
Subject: [PATCH] gimplify.c (gimplify_decl_expr): For a TYPE_DECL, also
 gimplify the DECL_ORIGINAL_TYPE if it is present.

	* gimplify.c (gimplify_decl_expr): For a TYPE_DECL, also gimplify the
	DECL_ORIGINAL_TYPE if it is present.

From-SVN: r187369
---
 gcc/ChangeLog                   |  5 +++++
 gcc/gimplify.c                  |  7 +++++++
 gcc/testsuite/ChangeLog         |  4 ++++
 gcc/testsuite/gnat.dg/lto11.adb | 20 ++++++++++++++++++++
 gcc/testsuite/gnat.dg/lto11.ads |  9 +++++++++
 5 files changed, 45 insertions(+)
 create mode 100644 gcc/testsuite/gnat.dg/lto11.adb
 create mode 100644 gcc/testsuite/gnat.dg/lto11.ads

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bd51a3c8945e..d9eca8eefa10 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2012-05-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* gimplify.c (gimplify_decl_expr): For a TYPE_DECL, also gimplify the
+	DECL_ORIGINAL_TYPE if it is present.
+
 2012-05-10  Nick Clifton  <nickc@redhat.com>
 
 	PR target/53120
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 811fa221fec3..ca38a0e26759 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -1441,6 +1441,13 @@ gimplify_decl_expr (tree *stmt_p, gimple_seq *seq_p)
       && !TYPE_SIZES_GIMPLIFIED (TREE_TYPE (decl)))
     gimplify_type_sizes (TREE_TYPE (decl), seq_p);
 
+  /* ??? DECL_ORIGINAL_TYPE is streamed for LTO so it needs to be gimplified
+     in case its size expressions contain problematic nodes like CALL_EXPR.  */
+  if (TREE_CODE (decl) == TYPE_DECL
+      && DECL_ORIGINAL_TYPE (decl)
+      && !TYPE_SIZES_GIMPLIFIED (DECL_ORIGINAL_TYPE (decl)))
+    gimplify_type_sizes (DECL_ORIGINAL_TYPE (decl), seq_p);
+
   if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
     {
       tree init = DECL_INITIAL (decl);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7cdad4a6aaa0..7162e4e0ec87 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2012-05-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* gnat.dg/lto11.ad[sb]: New test.
+
 2012-05-09  Uros Bizjak  <ubizjak@gmail.com>
 
 	PR target/52908
diff --git a/gcc/testsuite/gnat.dg/lto11.adb b/gcc/testsuite/gnat.dg/lto11.adb
new file mode 100644
index 000000000000..ad0b8db30a30
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/lto11.adb
@@ -0,0 +1,20 @@
+-- { dg-do compile }
+-- { dg-options "-flto" { target lto } }
+
+with Ada.Streams; use Ada.Streams;
+
+package body Lto11 is
+
+   procedure Write
+     (S : not null access Root_Stream_Type'Class;
+      V : Vector)
+   is
+      subtype M_SEA is Stream_Element_Array (1 .. V'Size / Stream_Element'Size);
+      Bytes : M_SEA;
+      for Bytes'Address use V'Address;
+      pragma Import (Ada, Bytes);
+   begin
+      Ada.Streams.Write (S.all, Bytes);
+   end;
+
+end Lto11;
diff --git a/gcc/testsuite/gnat.dg/lto11.ads b/gcc/testsuite/gnat.dg/lto11.ads
new file mode 100644
index 000000000000..386d5ac4620a
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/lto11.ads
@@ -0,0 +1,9 @@
+with Ada.Streams; use Ada.Streams;
+
+package Lto11 is
+
+   type Vector is array (Positive range <>) of Float;
+
+   procedure Write (S : not null access Root_Stream_Type'Class; V : Vector);
+
+end Lto11;
-- 
GitLab