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:
parent
0029bafd89
commit
1c4ae4e587
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
17
gcc/testsuite/gnat.dg/discr35.adb
Normal file
17
gcc/testsuite/gnat.dg/discr35.adb
Normal 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;
|
25
gcc/testsuite/gnat.dg/discr35.ads
Normal file
25
gcc/testsuite/gnat.dg/discr35.ads
Normal 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;
|
Loading…
x
Reference in New Issue
Block a user