diff options
| author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-26 15:15:14 +0000 |
|---|---|---|
| committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-26 15:15:14 +0000 |
| commit | 6b8d43fc1820aef13c4a267f82a92e7e90380ec6 (patch) | |
| tree | 46c60dccfdc124935bda6f8c97975730af00f90d | |
| parent | a5093862059fbc434fc70fa576e93c6adc0d116a (diff) | |
| download | ppe42-gcc-6b8d43fc1820aef13c4a267f82a92e7e90380ec6.tar.gz ppe42-gcc-6b8d43fc1820aef13c4a267f82a92e7e90380ec6.zip | |
2008-05-26 Gary Dismukes <dismukes@adacore.com>
* exp_ch3.adb (Build_Array_Init_Proc): Only set Init_Proc to a dummy
init proc entity when there is actual default initialization associated
with the component type, to avoid spurious errors on objects of scalar
array types that are marked Is_Public when No_Default_Initialization
applies.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@135938 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ada/exp_ch3.adb | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index c1195518c97..8324763e92a 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -533,11 +533,12 @@ package body Exp_Ch3 is --------------------------- procedure Build_Array_Init_Proc (A_Type : Entity_Id; Nod : Node_Id) is - Loc : constant Source_Ptr := Sloc (Nod); - Comp_Type : constant Entity_Id := Component_Type (A_Type); - Index_List : List_Id; - Proc_Id : Entity_Id; - Body_Stmts : List_Id; + Loc : constant Source_Ptr := Sloc (Nod); + Comp_Type : constant Entity_Id := Component_Type (A_Type); + Index_List : List_Id; + Proc_Id : Entity_Id; + Body_Stmts : List_Id; + Has_Default_Init : Boolean; function Init_Component return List_Id; -- Create one statement to initialize one array component, designated @@ -671,14 +672,16 @@ package body Exp_Ch3 is -- the issue arises) in a special manner anyway which does not need an -- init_proc. - if Has_Non_Null_Base_Init_Proc (Comp_Type) - or else Needs_Simple_Initialization (Comp_Type) - or else Has_Task (Comp_Type) + Has_Default_Init := Has_Non_Null_Base_Init_Proc (Comp_Type) + or else Needs_Simple_Initialization (Comp_Type) + or else Has_Task (Comp_Type); + + if Has_Default_Init or else (not Restriction_Active (No_Initialize_Scalars) - and then Is_Public (A_Type) - and then Root_Type (A_Type) /= Standard_String - and then Root_Type (A_Type) /= Standard_Wide_String - and then Root_Type (A_Type) /= Standard_Wide_Wide_String) + and then Is_Public (A_Type) + and then Root_Type (A_Type) /= Standard_String + and then Root_Type (A_Type) /= Standard_Wide_String + and then Root_Type (A_Type) /= Standard_Wide_Wide_String) then Proc_Id := Make_Defining_Identifier (Loc, @@ -688,9 +691,16 @@ package body Exp_Ch3 is -- want to build an init_proc, but we need to mark that an init_proc -- would be needed if this restriction was not active (so that we can -- detect attempts to call it), so set a dummy init_proc in place. + -- This is only done though when actual default initialization is + -- needed, so we exclude the setting in the Is_Public case, such + -- as for arrays of scalars, since otherwise such objects would be + -- wrongly flagged as violating the restriction. if Restriction_Active (No_Default_Initialization) then - Set_Init_Proc (A_Type, Proc_Id); + if Has_Default_Init then + Set_Init_Proc (A_Type, Proc_Id); + end if; + return; end if; |

