trans.c (Identifier_to_gnu): Move block retrieving the type of the result to the end and execute it for a...

* gcc-interface/trans.c (Identifier_to_gnu): Move block retrieving the
	type of the result to the end and execute it for a deferred constant of
	a discriminated type whose full view can be elaborated statically.

From-SVN: r184259
This commit is contained in:
Eric Botcazou 2012-02-15 08:50:11 +00:00 committed by Eric Botcazou
parent 0029bafd89
commit 1c4ae4e587
5 changed files with 71 additions and 12 deletions

View File

@ -1,3 +1,9 @@
2012-02-15 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (Identifier_to_gnu): Move block retrieving the
type of the result to the end and execute it for a deferred constant of
a discriminated type whose full view can be elaborated statically.
2012-02-15 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (gnat_to_gnu) <N_Qualified_Expression>: If the

View File

@ -1077,17 +1077,6 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
}
}
/* The GNAT tree has the type of a function as the type of its result. Also
use the type of the result if the Etype is a subtype which is nominally
unconstrained. But remove any padding from the resulting type. */
if (TREE_CODE (TREE_TYPE (gnu_result)) == FUNCTION_TYPE
|| Is_Constr_Subt_For_UN_Aliased (gnat_temp_type))
{
gnu_result_type = TREE_TYPE (gnu_result);
if (TYPE_IS_PADDING_P (gnu_result_type))
gnu_result_type = TREE_TYPE (TYPE_FIELDS (gnu_result_type));
}
/* 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.
@ -1120,6 +1109,24 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
gnu_result = unshare_expr (DECL_INITIAL (gnu_result));
}
/* The GNAT tree has the type of a function set to its result type, so we
adjust here. Also use the type of the result if the Etype is a subtype
that is nominally unconstrained. Likewise if this is a deferred constant
of a discriminated type whose full view can be elaborated statically, to
avoid problematic conversions to the nominal subtype. But remove any
padding from the resulting type. */
if (TREE_CODE (TREE_TYPE (gnu_result)) == FUNCTION_TYPE
|| Is_Constr_Subt_For_UN_Aliased (gnat_temp_type)
|| (Ekind (gnat_temp) == E_Constant
&& Present (Full_View (gnat_temp))
&& Has_Discriminants (gnat_temp_type)
&& TREE_CODE (gnu_result) == CONSTRUCTOR))
{
gnu_result_type = TREE_TYPE (gnu_result);
if (TYPE_IS_PADDING_P (gnu_result_type))
gnu_result_type = TREE_TYPE (TYPE_FIELDS (gnu_result_type));
}
*gnu_result_type_p = gnu_result_type;
return gnu_result;

View File

@ -1,6 +1,10 @@
2012-02-15 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/volatile10.adb: New case.
* gnat.dg/discr35.ad[sb]: New test.
2012-02-15 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/volatile10.adb: New test.
* gnat.dg/volatile10_pkg.ads: New helper.
2012-02-14 Jason Merrill <jason@redhat.com>

View File

@ -0,0 +1,17 @@
-- { dg-do compile }
package body Discr35 is
procedure Proc1 is
R : Rec2 := Null_Rec2;
begin
null;
end;
procedure Proc2 is
R : Rec2;
begin
R := Null_Rec2;
end;
end Discr35;

View File

@ -0,0 +1,25 @@
package Discr35 is
type Rec1 is tagged null record;
type Enum is (One, Two);
type Rec2 (D : Enum := One) is
record
case D is
when One => null;
when Two => R : Rec1;
end case;
end record;
Null_Rec2 : Constant Rec2;
procedure Proc1;
procedure Proc2;
private
Null_Rec2 : Constant Rec2 := (D => One);
end Discr35;