trans.c (Identifier_to_gnu): Do not return initializers of aggregate types that contain a placeholder.
* gcc-interface/trans.c (Identifier_to_gnu): Do not return initializers of aggregate types that contain a placeholder. From-SVN: r172209
This commit is contained in:
parent
42821aff0a
commit
88872b00da
@ -1,3 +1,8 @@
|
||||
2011-04-08 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gcc-interface/trans.c (Identifier_to_gnu): Do not return initializers
|
||||
of aggregate types that contain a placeholder.
|
||||
|
||||
2011-04-08 Nathan Froyd <froydnj@codesourcery.com>
|
||||
|
||||
* gcc-interface/utils.c (handle_sentinel_attribute): Don't use
|
||||
|
@ -1058,10 +1058,14 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
|
||||
|
||||
/* 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. */
|
||||
elaboration code if this identifier is used as an initializer itself.
|
||||
Don't do it for aggregate types that contain a placeholder since their
|
||||
initializers cannot be manipulated easily. */
|
||||
if (TREE_CONSTANT (gnu_result)
|
||||
&& DECL_P (gnu_result)
|
||||
&& DECL_INITIAL (gnu_result))
|
||||
&& DECL_INITIAL (gnu_result)
|
||||
&& !(AGGREGATE_TYPE_P (TREE_TYPE (gnu_result))
|
||||
&& type_contains_placeholder_p (TREE_TYPE (gnu_result))))
|
||||
{
|
||||
bool constant_only = (TREE_CODE (gnu_result) == CONST_DECL
|
||||
&& !DECL_CONST_CORRESPONDING_VAR (gnu_result));
|
||||
|
@ -1,3 +1,8 @@
|
||||
2011-04-08 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gnat.dg/aggr17.adb: New test.
|
||||
* gnat.dg/aggr18.adb: Likewise.
|
||||
|
||||
2011-04-08 Michael Matz <matz@suse.de>
|
||||
|
||||
PR middle-end/48389
|
||||
|
28
gcc/testsuite/gnat.dg/aggr17.adb
Normal file
28
gcc/testsuite/gnat.dg/aggr17.adb
Normal file
@ -0,0 +1,28 @@
|
||||
-- { dg-do compile }
|
||||
-- { dg-options "-gnatws" }
|
||||
|
||||
procedure Aggr17 is
|
||||
|
||||
type Enum is (A, B);
|
||||
|
||||
type Rec (D : Enum := Enum'First) is record
|
||||
case D is
|
||||
when A => X : Integer;
|
||||
when B => null;
|
||||
end case;
|
||||
end record;
|
||||
for Rec'Size use 128;
|
||||
pragma Volatile (Rec);
|
||||
|
||||
type Config_T (D : Enum := Enum'First) is record
|
||||
N : Natural;
|
||||
R : Rec (D);
|
||||
end record;
|
||||
|
||||
C : constant Config_T := (D => A, N => 1, R => (D => A, X => 0));
|
||||
|
||||
type Arr is array (Natural range 1 .. C.N) of Boolean;
|
||||
|
||||
begin
|
||||
null;
|
||||
end;
|
28
gcc/testsuite/gnat.dg/aggr18.adb
Normal file
28
gcc/testsuite/gnat.dg/aggr18.adb
Normal file
@ -0,0 +1,28 @@
|
||||
-- { dg-do compile }
|
||||
-- { dg-options "-gnatws" }
|
||||
|
||||
procedure Aggr18 is
|
||||
|
||||
type Enum is (A, B);
|
||||
|
||||
type Rec (D : Enum := Enum'First) is record
|
||||
case D is
|
||||
when A => X : Integer;
|
||||
when B => null;
|
||||
end case;
|
||||
end record;
|
||||
for Rec'Size use 128;
|
||||
pragma Volatile (Rec);
|
||||
|
||||
type Config_T (D : Enum := Enum'First) is record
|
||||
N : Natural;
|
||||
R : Rec (D);
|
||||
end record;
|
||||
|
||||
C : Config_T := (D => A, N => 1, R => (D => A, X => 0));
|
||||
|
||||
type Arr is array (Natural range 1 .. C.N) of Boolean;
|
||||
|
||||
begin
|
||||
null;
|
||||
end;
|
Loading…
Reference in New Issue
Block a user