diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/decl.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/specs/aggr1.ads | 2 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/specs/aggr2.ads | 2 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/specs/aggr3.ads | 18 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/specs/aggr3_pkg.ads | 9 |
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; |