aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/decl.c20
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/gnat.dg/specs/aggr1.ads2
-rw-r--r--gcc/testsuite/gnat.dg/specs/aggr2.ads2
-rw-r--r--gcc/testsuite/gnat.dg/specs/aggr3.ads18
-rw-r--r--gcc/testsuite/gnat.dg/specs/aggr3_pkg.ads9
7 files changed, 60 insertions, 7 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index a9fa83c..5bc7819 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,9 @@
+2011-08-30 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Do not convert
+ the expression to the nominal type if the latter is a record type with
+ a variant part and the type of the former is a record type without one.
+
2011-08-30 Yannick Moy <moy@adacore.com>
* exp_aggr.adb, exp_ch11.adb, exp_prag.adb: Remove early exit during
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 512c05e..54903cf 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -1124,13 +1124,19 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
is a padded record whose field is of self-referential size. In
the former case, converting will generate unnecessary evaluations
of the CONSTRUCTOR to compute the size and in the latter case, we
- want to only copy the actual data. */
+ want to only copy the actual data. Also don't convert to a record
+ type with a variant part from a record type without one, to keep
+ the object simpler. */
if (gnu_expr
&& TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE
&& !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type))
&& !(TYPE_IS_PADDING_P (gnu_type)
&& CONTAINS_PLACEHOLDER_P
- (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type))))))
+ (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type)))))
+ && !(TREE_CODE (gnu_type) == RECORD_TYPE
+ && TREE_CODE (TREE_TYPE (gnu_expr)) == RECORD_TYPE
+ && get_variant_part (gnu_type) != NULL_TREE
+ && get_variant_part (TREE_TYPE (gnu_expr)) == NULL_TREE))
gnu_expr = convert (gnu_type, gnu_expr);
/* If this is a pointer that doesn't have an initializing expression,
@@ -1350,13 +1356,19 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
is a padded record whose field is of self-referential size. In
the former case, converting will generate unnecessary evaluations
of the CONSTRUCTOR to compute the size and in the latter case, we
- want to only copy the actual data. */
+ want to only copy the actual data. Also don't convert to a record
+ type with a variant part from a record type without one, to keep
+ the object simpler. */
if (gnu_expr
&& TREE_CODE (gnu_type) != UNCONSTRAINED_ARRAY_TYPE
&& !CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_type))
&& !(TYPE_IS_PADDING_P (gnu_type)
&& CONTAINS_PLACEHOLDER_P
- (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type))))))
+ (TYPE_SIZE (TREE_TYPE (TYPE_FIELDS (gnu_type)))))
+ && !(TREE_CODE (gnu_type) == RECORD_TYPE
+ && TREE_CODE (TREE_TYPE (gnu_expr)) == RECORD_TYPE
+ && get_variant_part (gnu_type) != NULL_TREE
+ && get_variant_part (TREE_TYPE (gnu_expr)) == NULL_TREE))
gnu_expr = convert (gnu_type, gnu_expr);
/* If this name is external or there was a name specified, use it,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0820eaf..1a1771f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2011-08-30 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/specs/aggr3.ads: New test.
+ * gnat.dg/specs/aggr3_pkg.ads: New helper.
+
+ * gnat.dg/specs/aggr1.ads: Remove superfluous space.
+ * gnat.dg/specs/aggr2.ads: Likewise.
+
2011-08-30 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/45170
@@ -3742,7 +3750,7 @@
* gcc.dg/pie-link.c: Use target pie.
2011-06-10 Eric Botcazou <ebotcazou@adacore.com>
- Laurent Rougé <laurent.rouge@menta.fr>
+ Laurent Roug� <laurent.rouge@menta.fr>
* gcc.dg/20020503-1.c: Add back -mflat option on the SPARC.
* gcc.target/sparc/sparc-ret.c: Skip if -mflat is passed.
diff --git a/gcc/testsuite/gnat.dg/specs/aggr1.ads b/gcc/testsuite/gnat.dg/specs/aggr1.ads
index 6c76635..f26f499 100644
--- a/gcc/testsuite/gnat.dg/specs/aggr1.ads
+++ b/gcc/testsuite/gnat.dg/specs/aggr1.ads
@@ -1,4 +1,4 @@
--- { dg-do compile }
+-- { dg-do compile }
package aggr1 is
type Buffer_Array is array (1 .. 2 ** 23) of Integer;
diff --git a/gcc/testsuite/gnat.dg/specs/aggr2.ads b/gcc/testsuite/gnat.dg/specs/aggr2.ads
index 8f7ea87..00bc44f 100644
--- a/gcc/testsuite/gnat.dg/specs/aggr2.ads
+++ b/gcc/testsuite/gnat.dg/specs/aggr2.ads
@@ -1,4 +1,4 @@
--- { dg-do compile }
+-- { dg-do compile }
package Aggr2 is
diff --git a/gcc/testsuite/gnat.dg/specs/aggr3.ads b/gcc/testsuite/gnat.dg/specs/aggr3.ads
new file mode 100644
index 0000000..09b4466
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/aggr3.ads
@@ -0,0 +1,18 @@
+-- { dg-do compile }
+
+with Aggr3_Pkg; use Aggr3_Pkg;
+
+package Aggr3 is
+
+ type Enum is (One);
+
+ type R (D : Enum := One) is
+ record
+ case D is
+ when One => The_T : T;
+ end case;
+ end record;
+
+ My_R : R := (D => One, The_T => My_T);
+
+end Aggr3;
diff --git a/gcc/testsuite/gnat.dg/specs/aggr3_pkg.ads b/gcc/testsuite/gnat.dg/specs/aggr3_pkg.ads
new file mode 100644
index 0000000..769426e
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/specs/aggr3_pkg.ads
@@ -0,0 +1,9 @@
+package Aggr3_Pkg is
+
+ type Root is abstract tagged null record;
+
+ type T is new Root with null record;
+
+ My_T : T;
+
+end Aggr3_Pkg;