[Ada] Objects of scalar array types get errors with No_Default_Initialization

Arnaud Charlet charlet@adacore.com
Mon May 26 15:48:00 GMT 2008


The compiler incorrectly flags errors on scalar array objects when the
restriction No_Default_Initialization applies and the array type is marked
Is_Public. This happens because a dummy Init_Proc entity is set on types
types marked Is_Public even though they may not have any associated
initialization, and the fix is to do this setting only if there is actual
default initialization associated with the type.

See gnat.dg/specs/array_no_def_init.ads

Tested on i686-pc-linux-gnu, committed on trunk

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.
-------------- next part --------------
Index: exp_ch3.adb
===================================================================
--- exp_ch3.adb	(revision 135923)
+++ exp_ch3.adb	(working copy)
@@ -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;
 


More information about the Gcc-patches mailing list