aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2011-04-08 20:21:36 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2011-04-08 20:21:36 +0000
commit88872b00daeaf461796962afeb8901c172aacc50 (patch)
treeda8a27e7232b2b2616631cf990d2551a1f14c9d6
parent42821aff0aa8c8118a0e19c2dc640b24ad26e1dc (diff)
downloadgcc-88872b00daeaf461796962afeb8901c172aacc50.zip
gcc-88872b00daeaf461796962afeb8901c172aacc50.tar.gz
gcc-88872b00daeaf461796962afeb8901c172aacc50.tar.bz2
trans.c (Identifier_to_gnu): Do not return initializers of aggregate types that contain a placeholder.
* gcc-interface/trans.c (Identifier_to_gnu): Do not return initializers of aggregate types that contain a placeholder. From-SVN: r172209
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/gcc-interface/trans.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/aggr17.adb28
-rw-r--r--gcc/testsuite/gnat.dg/aggr18.adb28
5 files changed, 72 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 155256e..2046aa7 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2011-04-08 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/trans.c (Identifier_to_gnu): Do not return initializers
+ of aggregate types that contain a placeholder.
+
2011-04-08 Nathan Froyd <froydnj@codesourcery.com>
* gcc-interface/utils.c (handle_sentinel_attribute): Don't use
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 9622625..378f88c 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -1058,10 +1058,14 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
/* If we have a constant declaration and its initializer, try to return the
latter to avoid the need to call fold in lots of places and the need for
- elaboration code if this identifier is used as an initializer itself. */
+ elaboration code if this identifier is used as an initializer itself.
+ Don't do it for aggregate types that contain a placeholder since their
+ initializers cannot be manipulated easily. */
if (TREE_CONSTANT (gnu_result)
&& DECL_P (gnu_result)
- && DECL_INITIAL (gnu_result))
+ && DECL_INITIAL (gnu_result)
+ && !(AGGREGATE_TYPE_P (TREE_TYPE (gnu_result))
+ && type_contains_placeholder_p (TREE_TYPE (gnu_result))))
{
bool constant_only = (TREE_CODE (gnu_result) == CONST_DECL
&& !DECL_CONST_CORRESPONDING_VAR (gnu_result));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4f5fb00..23f95b1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-04-08 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/aggr17.adb: New test.
+ * gnat.dg/aggr18.adb: Likewise.
+
2011-04-08 Michael Matz <matz@suse.de>
PR middle-end/48389
diff --git a/gcc/testsuite/gnat.dg/aggr17.adb b/gcc/testsuite/gnat.dg/aggr17.adb
new file mode 100644
index 0000000..3ba4198
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr17.adb
@@ -0,0 +1,28 @@
+-- { dg-do compile }
+-- { dg-options "-gnatws" }
+
+procedure Aggr17 is
+
+ type Enum is (A, B);
+
+ type Rec (D : Enum := Enum'First) is record
+ case D is
+ when A => X : Integer;
+ when B => null;
+ end case;
+ end record;
+ for Rec'Size use 128;
+ pragma Volatile (Rec);
+
+ type Config_T (D : Enum := Enum'First) is record
+ N : Natural;
+ R : Rec (D);
+ end record;
+
+ C : constant Config_T := (D => A, N => 1, R => (D => A, X => 0));
+
+ type Arr is array (Natural range 1 .. C.N) of Boolean;
+
+begin
+ null;
+end;
diff --git a/gcc/testsuite/gnat.dg/aggr18.adb b/gcc/testsuite/gnat.dg/aggr18.adb
new file mode 100644
index 0000000..511add8
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr18.adb
@@ -0,0 +1,28 @@
+-- { dg-do compile }
+-- { dg-options "-gnatws" }
+
+procedure Aggr18 is
+
+ type Enum is (A, B);
+
+ type Rec (D : Enum := Enum'First) is record
+ case D is
+ when A => X : Integer;
+ when B => null;
+ end case;
+ end record;
+ for Rec'Size use 128;
+ pragma Volatile (Rec);
+
+ type Config_T (D : Enum := Enum'First) is record
+ N : Natural;
+ R : Rec (D);
+ end record;
+
+ C : Config_T := (D => A, N => 1, R => (D => A, X => 0));
+
+ type Arr is array (Natural range 1 .. C.N) of Boolean;
+
+begin
+ null;
+end;