From 1ce1f005363955236991e5b86f4f6f90619233b9 Mon Sep 17 00:00:00 2001 From: Gary Dismukes Date: Mon, 26 May 2008 17:50:54 +0200 Subject: [PATCH] exp_ch3.adb (Expand_N_Object_Declaration): Remove checks for No_Default_Initialization... 2008-05-26 Gary Dismukes * exp_ch3.adb (Expand_N_Object_Declaration): Remove checks for No_Default_Initialization, which is now delayed until the freeze point of the object. Add a comment about deferral of the check. * freeze.adb (Freeze_Entity): The check for No_Default_Initialization on objects is moved here. From-SVN: r135941 --- gcc/ada/exp_ch3.adb | 7 +++++-- gcc/ada/freeze.adb | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index 8324763e92a..71f09e4f3f1 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -4278,7 +4278,11 @@ package body Exp_Ch3 is and then not Suppress_Init_Proc (Typ) then - Check_Restriction (No_Default_Initialization, N); + -- Return without initializing when No_Default_Initialization + -- applies. Note that the actual restriction check occurs later, + -- when the object is frozen, because we don't know yet whether + -- the object is imported, which is a case where the check does + -- not apply. if Restriction_Active (No_Default_Initialization) then return; @@ -4324,7 +4328,6 @@ package body Exp_Ch3 is and then not Is_Internal (Def_Id) and then not Has_Init_Expression (N) then - Check_Restriction (No_Default_Initialization, N); Set_No_Initialization (N, False); Set_Expression (N, Get_Simple_Init_Val (Typ, N, Esize (Def_Id))); Analyze_And_Resolve (Expression (N), Typ); diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index bf4f94677e8..31f93985c44 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -29,6 +29,7 @@ with Debug; use Debug; with Einfo; use Einfo; with Elists; use Elists; with Errout; use Errout; +with Exp_Ch3; use Exp_Ch3; with Exp_Ch7; use Exp_Ch7; with Exp_Disp; use Exp_Disp; with Exp_Pakd; use Exp_Pakd; @@ -2651,10 +2652,31 @@ package body Freeze is Validate_Object_Declaration (Declaration_Node (E)); - -- If there is an address clause, check it is valid + -- If there is an address clause, check that it is valid Check_Address_Clause (E); + -- If the object needs any kind of default initialization, an + -- error must be issued if No_Default_Initialization applies. + -- The check doesn't apply to imported objects, which are not + -- ever default initialized, and is why the check is deferred + -- until freezing, at which point we know if Import applies. + + if not Is_Imported (E) + and then not Has_Init_Expression (Declaration_Node (E)) + and then + ((Has_Non_Null_Base_Init_Proc (Etype (E)) + and then not No_Initialization (Declaration_Node (E)) + and then not Is_Value_Type (Etype (E)) + and then not Suppress_Init_Proc (Etype (E))) + or else + (Needs_Simple_Initialization (Etype (E)) + and then not Is_Internal (E))) + then + Check_Restriction + (No_Default_Initialization, Declaration_Node (E)); + end if; + -- For imported objects, set Is_Public unless there is also an -- address clause, which means that there is no external symbol -- needed for the Import (Is_Public may still be set for other -- 2.30.2