Commit 10a22f43 by Eric Botcazou Committed by Eric Botcazou

decl.c (gnat_to_gnu_entity): Do not convert the expression to the nominal type if...

	* 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.

Co-Authored-By: Laurent Rougé <laurent.rouge@menta.fr>

From-SVN: r178331
parent b6717379
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
......
......@@ -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,
......
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.
......
-- { dg-do compile }
-- { dg-do compile }
package aggr1 is
type Buffer_Array is array (1 .. 2 ** 23) of Integer;
......
-- { dg-do compile }
-- { dg-do compile }
package Aggr2 is
......
-- { 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;
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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment