]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Mon, 4 Aug 2014 09:59:56 +0000 (11:59 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Mon, 4 Aug 2014 09:59:56 +0000 (11:59 +0200)
2014-08-04  Robert Dewar  <dewar@adacore.com>

* prj-strt.adb, prj-strt.ads, sem_attr.adb: Minor reformatting.

2014-08-04  Hristian Kirtchev  <kirtchev@adacore.com>

* aspects.adb Add an entry in table Canonical_Aspect for
Default_Initial_Condition.
* aspects.ads Add an entry in tables Aspect_Id, Aspect_Argument,
Aspect_Names and Aspect_Delay for Default_Initial_Condition.
* einfo.adb Flag3 is now Has_Default_Init_Cond. Flag132
is now Is_Default_Init_Cond_ Procedure. Flag133 is now
Has_Inherited_Default_Init_Cond.
(Default_Init_Cond_Procedure): New routine.
(Has_Default_Init_Cond): New routine.
(Has_Inherited_Default_Init_Cond): New routine.
(Is_Default_Init_Cond_Procedure): New routine.
(Set_Default_Init_Cond_Procedure): New routine.
(Set_Has_Default_Init_Cond): New routine.
(Set_Has_Inherited_Default_Init_Cond): New routine.
(Set_Is_Default_Init_Cond_Procedure): New routine.
(Write_Entity_Flags): Output all the new flags.
* einfo.ads New attributes Default_Init_Cond_Procedure,
Has_Inherited_Default_Init_Cond and Is_Default_Init_Cond_Procedure
along with usage in nodes.
(Default_Init_Cond_Procedure): New routine.
(Has_Default_Init_Cond): New routine and pragma Inline.
(Has_Inherited_Default_Init_Cond): New routine and
pragma Inline.
(Is_Default_Init_Cond_Procedure): New routine and
pragma Inline.
(Set_Default_Init_Cond_Procedure): New routine.
(Set_Has_Default_Init_Cond): New routine and pragma Inline.
(Set_Has_Inherited_Default_Init_Cond): New routine and pragma Inline.
(Set_Is_Default_Init_Cond_Procedure): New routine and pragma Inline.
* exp_ch3.adb (Expand_N_Object_Declaration): New constant
Next_N. Generate a call to the default initial condition procedure
if the object's type is subject to the pragma. (Freeze_Type):
Generate the body of the default initial condition procedure or
inherit the spec from a parent type.
* exp_ch7.adb Add with and use clause for Exp_Prag.
(Expand_Pragma_Initial_Condition): Removed.
* exp_prag.ads, exp_prag.adb (Expand_Pragma_Initial_Condition): New
routine.
* par-prag.adb (Prag): Pragma Default_Initial_Condition does
not need special treatment by the parser.
* sem_ch3.adb (Build_Derived_Record_Type): Propagate the
attributes related to pragma Default_Initial_Condition to the
derived type.
(Process_Full_View): Propagate the attributes
related to pragma Default_Initial_Condition to the full view.
* sem_ch7.adb (Analyze_Package_Specification): Build the
declaration of the default initial condition procedure for all
types that qualify or inherit the one from the parent type.
* sem_ch13.adb (Analyze_Aspect_Specifications):
Add processing for aspect Default_Initial_Condition.
(Check_Aspect_At_Freeze_Point): Aspect
Default_Initial_Condition does not require delayed analysis.
(Replace_Type_References_Generic): Moved to spec.
* sem_ch13.ads (Replace_Type_References_Generic): Moved from body.
* sem_prag.adb Add an entry in table Sif_Glags for
Default_Initial_Condition.
(Analyze_Pragma): Pragma
Default_Initial_Condition is now part of assertion
policy. Add processing for pragma Default_Initial_Condition.
(Is_Valid_Assertion_Kind): Pragma Default_Initial_Condition is
now recognized as a proper assertion policy.
* sem_util.ads, sem_util.adb (Build_Default_Init_Cond_Call): New
routine.
(Build_Default_Init_Cond_Procedure_Body): New routine.
(Build_Default_Init_Cond_Procedure_Declaration): New routine.
(Inherit_Default_Init_Cond_Procedure): New routine.
* snames.ads-tmpl Add new predefined name and pragma id for
Default_Initial_Condition.

From-SVN: r213552

21 files changed:
gcc/ada/ChangeLog
gcc/ada/aspects.adb
gcc/ada/aspects.ads
gcc/ada/einfo.adb
gcc/ada/einfo.ads
gcc/ada/exp_ch3.adb
gcc/ada/exp_ch7.adb
gcc/ada/exp_prag.adb
gcc/ada/exp_prag.ads
gcc/ada/par-prag.adb
gcc/ada/prj-strt.adb
gcc/ada/prj-strt.ads
gcc/ada/sem_attr.adb
gcc/ada/sem_ch13.adb
gcc/ada/sem_ch13.ads
gcc/ada/sem_ch3.adb
gcc/ada/sem_ch7.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_util.adb
gcc/ada/sem_util.ads
gcc/ada/snames.ads-tmpl

index 91804ed8a4ebab5b482ed93417f7489b11ddfa27..7659de4d35fecbbc5b9e1181b314f06c9d84ff6f 100644 (file)
@@ -1,3 +1,78 @@
+2014-08-04  Robert Dewar  <dewar@adacore.com>
+
+       * prj-strt.adb, prj-strt.ads, sem_attr.adb: Minor reformatting.
+
+2014-08-04  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * aspects.adb Add an entry in table Canonical_Aspect for
+       Default_Initial_Condition.
+       * aspects.ads Add an entry in tables Aspect_Id, Aspect_Argument,
+       Aspect_Names and Aspect_Delay for Default_Initial_Condition.
+       * einfo.adb Flag3 is now Has_Default_Init_Cond. Flag132
+       is now Is_Default_Init_Cond_ Procedure. Flag133 is now
+       Has_Inherited_Default_Init_Cond.
+       (Default_Init_Cond_Procedure): New routine.
+       (Has_Default_Init_Cond): New routine.
+       (Has_Inherited_Default_Init_Cond): New routine.
+       (Is_Default_Init_Cond_Procedure): New routine.
+       (Set_Default_Init_Cond_Procedure): New routine.
+       (Set_Has_Default_Init_Cond): New routine.
+       (Set_Has_Inherited_Default_Init_Cond): New routine.
+       (Set_Is_Default_Init_Cond_Procedure): New routine.
+       (Write_Entity_Flags): Output all the new flags.
+       * einfo.ads New attributes Default_Init_Cond_Procedure,
+       Has_Inherited_Default_Init_Cond and Is_Default_Init_Cond_Procedure
+       along with usage in nodes.
+       (Default_Init_Cond_Procedure): New routine.
+       (Has_Default_Init_Cond): New routine and pragma Inline.
+       (Has_Inherited_Default_Init_Cond): New routine and
+       pragma Inline.
+       (Is_Default_Init_Cond_Procedure): New routine and
+       pragma Inline.
+       (Set_Default_Init_Cond_Procedure): New routine.
+       (Set_Has_Default_Init_Cond): New routine and pragma Inline.
+       (Set_Has_Inherited_Default_Init_Cond): New routine and pragma Inline.
+       (Set_Is_Default_Init_Cond_Procedure): New routine and pragma Inline.
+       * exp_ch3.adb (Expand_N_Object_Declaration): New constant
+       Next_N. Generate a call to the default initial condition procedure
+       if the object's type is subject to the pragma.  (Freeze_Type):
+       Generate the body of the default initial condition procedure or
+       inherit the spec from a parent type.
+       * exp_ch7.adb Add with and use clause for Exp_Prag.
+       (Expand_Pragma_Initial_Condition): Removed.
+       * exp_prag.ads, exp_prag.adb (Expand_Pragma_Initial_Condition): New
+       routine.
+       * par-prag.adb (Prag): Pragma Default_Initial_Condition does
+       not need special treatment by the parser.
+       * sem_ch3.adb (Build_Derived_Record_Type): Propagate the
+       attributes related to pragma Default_Initial_Condition to the
+       derived type.
+       (Process_Full_View): Propagate the attributes
+       related to pragma Default_Initial_Condition to the full view.
+       * sem_ch7.adb (Analyze_Package_Specification): Build the
+       declaration of the default initial condition procedure for all
+       types that qualify or inherit the one from the parent type.
+       * sem_ch13.adb (Analyze_Aspect_Specifications):
+       Add processing for aspect Default_Initial_Condition.
+       (Check_Aspect_At_Freeze_Point): Aspect
+       Default_Initial_Condition does not require delayed analysis.
+       (Replace_Type_References_Generic): Moved to spec.
+       * sem_ch13.ads (Replace_Type_References_Generic): Moved from body.
+       * sem_prag.adb Add an entry in table Sif_Glags for
+       Default_Initial_Condition.
+       (Analyze_Pragma): Pragma
+       Default_Initial_Condition is now part of assertion
+       policy. Add processing for pragma Default_Initial_Condition.
+       (Is_Valid_Assertion_Kind): Pragma Default_Initial_Condition is
+       now recognized as a proper assertion policy.
+       * sem_util.ads, sem_util.adb (Build_Default_Init_Cond_Call): New
+       routine.
+       (Build_Default_Init_Cond_Procedure_Body): New routine.
+       (Build_Default_Init_Cond_Procedure_Declaration): New routine.
+       (Inherit_Default_Init_Cond_Procedure): New routine.
+       * snames.ads-tmpl Add new predefined name and pragma id for
+       Default_Initial_Condition.
+
 2014-08-04  Vincent Celier  <celier@adacore.com>
 
        * prj-dect.adb (Parse_Case_Construction): It is no longer
index 7b003163323966efe37f51dd79842a2c5eca0406..b1e2e101104583626a36e13f74639687ab8cc16b 100644 (file)
@@ -509,6 +509,7 @@ package body Aspects is
     Aspect_Convention                   => Aspect_Convention,
     Aspect_CPU                          => Aspect_CPU,
     Aspect_Default_Component_Value      => Aspect_Default_Component_Value,
+    Aspect_Default_Initial_Condition    => Aspect_Default_Initial_Condition,
     Aspect_Default_Iterator             => Aspect_Default_Iterator,
     Aspect_Default_Value                => Aspect_Default_Value,
     Aspect_Depends                      => Aspect_Depends,
index 84567f3bcc03caf6822f5652527e2a4e60c2cdfa..8e47172803a869edfb1b66e109fdb45b0790acb4 100644 (file)
@@ -86,6 +86,7 @@ package Aspects is
       Aspect_Convention,
       Aspect_CPU,
       Aspect_Default_Component_Value,
+      Aspect_Default_Initial_Condition,     -- GNAT
       Aspect_Default_Iterator,
       Aspect_Default_Value,
       Aspect_Depends,                       -- GNAT
@@ -296,76 +297,77 @@ package Aspects is
    --  The following array indicates what argument type is required
 
    Aspect_Argument : constant array (Aspect_Id) of Aspect_Expression :=
-     (No_Aspect                      => Optional_Expression,
-      Aspect_Abstract_State          => Expression,
-      Aspect_Address                 => Expression,
-      Aspect_Alignment               => Expression,
-      Aspect_Annotate                => Expression,
-      Aspect_Attach_Handler          => Expression,
-      Aspect_Bit_Order               => Expression,
-      Aspect_Component_Size          => Expression,
-      Aspect_Constant_Indexing       => Name,
-      Aspect_Contract_Cases          => Expression,
-      Aspect_Convention              => Name,
-      Aspect_CPU                     => Expression,
-      Aspect_Default_Component_Value => Expression,
-      Aspect_Default_Iterator        => Name,
-      Aspect_Default_Value           => Expression,
-      Aspect_Depends                 => Expression,
-      Aspect_Dimension               => Expression,
-      Aspect_Dimension_System        => Expression,
-      Aspect_Dispatching_Domain      => Expression,
-      Aspect_Dynamic_Predicate       => Expression,
-      Aspect_External_Name           => Expression,
-      Aspect_External_Tag            => Expression,
-      Aspect_Global                  => Expression,
-      Aspect_Implicit_Dereference    => Name,
-      Aspect_Initial_Condition       => Expression,
-      Aspect_Initializes             => Expression,
-      Aspect_Input                   => Name,
-      Aspect_Interrupt_Priority      => Expression,
-      Aspect_Invariant               => Expression,
-      Aspect_Iterable                => Expression,
-      Aspect_Iterator_Element        => Name,
-      Aspect_Link_Name               => Expression,
-      Aspect_Linker_Section          => Expression,
-      Aspect_Machine_Radix           => Expression,
-      Aspect_Object_Size             => Expression,
-      Aspect_Output                  => Name,
-      Aspect_Part_Of                 => Expression,
-      Aspect_Post                    => Expression,
-      Aspect_Postcondition           => Expression,
-      Aspect_Pre                     => Expression,
-      Aspect_Precondition            => Expression,
-      Aspect_Predicate               => Expression,
-      Aspect_Priority                => Expression,
-      Aspect_Read                    => Name,
-      Aspect_Refined_Depends         => Expression,
-      Aspect_Refined_Global          => Expression,
-      Aspect_Refined_Post            => Expression,
-      Aspect_Refined_State           => Expression,
-      Aspect_Relative_Deadline       => Expression,
-      Aspect_Scalar_Storage_Order    => Expression,
-      Aspect_Simple_Storage_Pool     => Name,
-      Aspect_Size                    => Expression,
-      Aspect_Small                   => Expression,
-      Aspect_SPARK_Mode              => Optional_Name,
-      Aspect_Static_Predicate        => Expression,
-      Aspect_Storage_Pool            => Name,
-      Aspect_Storage_Size            => Expression,
-      Aspect_Stream_Size             => Expression,
-      Aspect_Suppress                => Name,
-      Aspect_Synchronization         => Name,
-      Aspect_Test_Case               => Expression,
-      Aspect_Type_Invariant          => Expression,
-      Aspect_Unsuppress              => Name,
-      Aspect_Value_Size              => Expression,
-      Aspect_Variable_Indexing       => Name,
-      Aspect_Warnings                => Name,
-      Aspect_Write                   => Name,
-
-      Boolean_Aspects                => Optional_Expression,
-      Library_Unit_Aspects           => Optional_Expression);
+     (No_Aspect                        => Optional_Expression,
+      Aspect_Abstract_State            => Expression,
+      Aspect_Address                   => Expression,
+      Aspect_Alignment                 => Expression,
+      Aspect_Annotate                  => Expression,
+      Aspect_Attach_Handler            => Expression,
+      Aspect_Bit_Order                 => Expression,
+      Aspect_Component_Size            => Expression,
+      Aspect_Constant_Indexing         => Name,
+      Aspect_Contract_Cases            => Expression,
+      Aspect_Convention                => Name,
+      Aspect_CPU                       => Expression,
+      Aspect_Default_Component_Value   => Expression,
+      Aspect_Default_Initial_Condition => Optional_Expression,
+      Aspect_Default_Iterator          => Name,
+      Aspect_Default_Value             => Expression,
+      Aspect_Depends                   => Expression,
+      Aspect_Dimension                 => Expression,
+      Aspect_Dimension_System          => Expression,
+      Aspect_Dispatching_Domain        => Expression,
+      Aspect_Dynamic_Predicate         => Expression,
+      Aspect_External_Name             => Expression,
+      Aspect_External_Tag              => Expression,
+      Aspect_Global                    => Expression,
+      Aspect_Implicit_Dereference      => Name,
+      Aspect_Initial_Condition         => Expression,
+      Aspect_Initializes               => Expression,
+      Aspect_Input                     => Name,
+      Aspect_Interrupt_Priority        => Expression,
+      Aspect_Invariant                 => Expression,
+      Aspect_Iterable                  => Expression,
+      Aspect_Iterator_Element          => Name,
+      Aspect_Link_Name                 => Expression,
+      Aspect_Linker_Section            => Expression,
+      Aspect_Machine_Radix             => Expression,
+      Aspect_Object_Size               => Expression,
+      Aspect_Output                    => Name,
+      Aspect_Part_Of                   => Expression,
+      Aspect_Post                      => Expression,
+      Aspect_Postcondition             => Expression,
+      Aspect_Pre                       => Expression,
+      Aspect_Precondition              => Expression,
+      Aspect_Predicate                 => Expression,
+      Aspect_Priority                  => Expression,
+      Aspect_Read                      => Name,
+      Aspect_Refined_Depends           => Expression,
+      Aspect_Refined_Global            => Expression,
+      Aspect_Refined_Post              => Expression,
+      Aspect_Refined_State             => Expression,
+      Aspect_Relative_Deadline         => Expression,
+      Aspect_Scalar_Storage_Order      => Expression,
+      Aspect_Simple_Storage_Pool       => Name,
+      Aspect_Size                      => Expression,
+      Aspect_Small                     => Expression,
+      Aspect_SPARK_Mode                => Optional_Name,
+      Aspect_Static_Predicate          => Expression,
+      Aspect_Storage_Pool              => Name,
+      Aspect_Storage_Size              => Expression,
+      Aspect_Stream_Size               => Expression,
+      Aspect_Suppress                  => Name,
+      Aspect_Synchronization           => Name,
+      Aspect_Test_Case                 => Expression,
+      Aspect_Type_Invariant            => Expression,
+      Aspect_Unsuppress                => Name,
+      Aspect_Value_Size                => Expression,
+      Aspect_Variable_Indexing         => Name,
+      Aspect_Warnings                  => Name,
+      Aspect_Write                     => Name,
+
+      Boolean_Aspects                  => Optional_Expression,
+      Library_Unit_Aspects             => Optional_Expression);
 
    -----------------------------------------
    -- Table Linking Names and Aspect_Id's --
@@ -392,9 +394,10 @@ package Aspects is
       Aspect_Contract_Cases               => Name_Contract_Cases,
       Aspect_Convention                   => Name_Convention,
       Aspect_CPU                          => Name_CPU,
+      Aspect_Default_Component_Value      => Name_Default_Component_Value,
+      Aspect_Default_Initial_Condition    => Name_Default_Initial_Condition,
       Aspect_Default_Iterator             => Name_Default_Iterator,
       Aspect_Default_Value                => Name_Default_Value,
-      Aspect_Default_Component_Value      => Name_Default_Component_Value,
       Aspect_Depends                      => Name_Depends,
       Aspect_Dimension                    => Name_Dimension,
       Aspect_Dimension_System             => Name_Dimension_System,
@@ -675,6 +678,7 @@ package Aspects is
       Aspect_Async_Writers                => Never_Delay,
       Aspect_Contract_Cases               => Never_Delay,
       Aspect_Convention                   => Never_Delay,
+      Aspect_Default_Initial_Condition    => Never_Delay,
       Aspect_Depends                      => Never_Delay,
       Aspect_Dimension                    => Never_Delay,
       Aspect_Dimension_System             => Never_Delay,
index 631ddc76c588e938ae2e08546b32b88b2d4b9938..76e5a6d67931526869dfa3da79c460c7783391ff 100644 (file)
@@ -270,6 +270,7 @@ package body Einfo is
 
    --    Is_Inlined_Always               Flag1
    --    Is_Hidden_Non_Overridden_Subpgm Flag2
+   --    Has_Default_Init_Cond           Flag3
    --    Is_Frozen                       Flag4
    --    Has_Discriminants               Flag5
    --    Is_Dispatching_Operation        Flag6
@@ -411,6 +412,8 @@ package body Einfo is
    --    Is_Generic_Instance             Flag130
 
    --    No_Pool_Assigned                Flag131
+   --    Is_Default_Init_Cond_Procedure  Flag132
+   --    Has_Inherited_Default_Init_Cond Flag133
    --    Has_Aliased_Components          Flag135
    --    No_Strict_Aliasing              Flag136
    --    Is_Machine_Code_Subprogram      Flag137
@@ -569,10 +572,6 @@ package body Einfo is
    --    No_Predicate_On_Actual          Flag275
    --    No_Dynamic_Predicate_On_Actual  Flag276
 
-   --    (unused)                        Flag3
-
-   --    (unused)                        Flag132
-   --    (unused)                        Flag133
    --    (unused)                        Flag134
 
    --    (unused)                        Flag275
@@ -1394,6 +1393,11 @@ package body Einfo is
       return Flag39 (Base_Type (Id));
    end Has_Default_Aspect;
 
+   function Has_Default_Init_Cond (Id : E) return B is
+   begin
+      return Flag3 (Id);
+   end Has_Default_Init_Cond;
+
    function Has_Delayed_Aspects (Id : E) return B is
    begin
       pragma Assert (Nkind (Id) in N_Entity);
@@ -1478,6 +1482,12 @@ package body Einfo is
       return Flag248 (Id);
    end Has_Inheritable_Invariants;
 
+   function Has_Inherited_Default_Init_Cond (Id : E) return B is
+   begin
+      pragma Assert (Is_Type (Id));
+      return Flag133 (Id);
+   end Has_Inherited_Default_Init_Cond;
+
    function Has_Initial_Value (Id : E) return B is
    begin
       pragma Assert (Ekind (Id) = E_Variable or else Is_Formal (Id));
@@ -1975,6 +1985,12 @@ package body Einfo is
       return Flag74 (Id);
    end Is_CPP_Class;
 
+   function Is_Default_Init_Cond_Procedure (Id : E) return B is
+   begin
+      pragma Assert (Ekind_In (Id, E_Function, E_Procedure));
+      return Flag132 (Id);
+   end Is_Default_Init_Cond_Procedure;
+
    function Is_Descendent_Of_Address (Id : E) return B is
    begin
       return Flag223 (Id);
@@ -2137,7 +2153,7 @@ package body Einfo is
 
    function Is_Invariant_Procedure (Id : E) return B is
    begin
-      pragma Assert (Ekind (Id) = E_Function or else Ekind (Id) = E_Procedure);
+      pragma Assert (Ekind_In (Id, E_Function, E_Procedure));
       return Flag257 (Id);
    end Is_Invariant_Procedure;
 
@@ -4140,6 +4156,12 @@ package body Einfo is
       Set_Flag39 (Id, V);
    end Set_Has_Default_Aspect;
 
+   procedure Set_Has_Default_Init_Cond (Id : E; V : B := True) is
+   begin
+      pragma Assert (Is_Type (Id));
+      Set_Flag3 (Id, V);
+   end Set_Has_Default_Init_Cond;
+
    procedure Set_Has_Delayed_Aspects (Id : E; V : B := True) is
    begin
       pragma Assert (Nkind (Id) in N_Entity);
@@ -4226,6 +4248,12 @@ package body Einfo is
       Set_Flag248 (Id, V);
    end Set_Has_Inheritable_Invariants;
 
+   procedure Set_Has_Inherited_Default_Init_Cond (Id : E; V : B := True) is
+   begin
+      pragma Assert (Is_Type (Id));
+      Set_Flag133 (Id, V);
+   end Set_Has_Inherited_Default_Init_Cond;
+
    procedure Set_Has_Initial_Value (Id : E; V : B := True) is
    begin
       pragma Assert (Ekind_In (Id, E_Variable, E_Out_Parameter));
@@ -4748,6 +4776,12 @@ package body Einfo is
       Set_Flag74 (Id, V);
    end Set_Is_CPP_Class;
 
+   procedure Set_Is_Default_Init_Cond_Procedure (Id : E; V : B := True) is
+   begin
+      pragma Assert (Ekind (Id) = E_Procedure);
+      Set_Flag132 (Id, V);
+   end Set_Is_Default_Init_Cond_Procedure;
+
    procedure Set_Is_Descendent_Of_Address (Id : E; V : B := True) is
    begin
       pragma Assert (Is_Type (Id));
@@ -4920,7 +4954,7 @@ package body Einfo is
 
    procedure Set_Is_Invariant_Procedure (Id : E; V : B := True) is
    begin
-      pragma Assert (Ekind (Id) = E_Function or else Ekind (Id) = E_Procedure);
+      pragma Assert (Ekind (Id) = E_Procedure);
       Set_Flag257 (Id, V);
    end Set_Is_Invariant_Procedure;
 
@@ -6410,6 +6444,31 @@ package body Einfo is
       end loop;
    end Declaration_Node;
 
+   ---------------------------------
+   -- Default_Init_Cond_Procedure --
+   ---------------------------------
+
+   function Default_Init_Cond_Procedure (Id : E) return E is
+      S : Entity_Id;
+
+   begin
+      pragma Assert
+        (Is_Type (Id)
+           and then (Has_Default_Init_Cond (Id)
+                       or Has_Inherited_Default_Init_Cond (Id)));
+
+      S := Subprograms_For_Type (Id);
+      while Present (S) loop
+         if Is_Default_Init_Cond_Procedure (S) then
+            return S;
+         end if;
+
+         S := Subprograms_For_Type (S);
+      end loop;
+
+      return Empty;
+   end Default_Init_Cond_Procedure;
+
    ---------------------
    -- Designated_Type --
    ---------------------
@@ -7913,6 +7972,34 @@ package body Einfo is
       end case;
    end Set_Component_Alignment;
 
+   -------------------------------------
+   -- Set_Default_Init_Cond_Procedure --
+   -------------------------------------
+
+   procedure Set_Default_Init_Cond_Procedure (Id : E; V : E) is
+      S : Entity_Id;
+
+   begin
+      pragma Assert
+        (Is_Type (Id)
+           and then (Has_Default_Init_Cond (Id)
+                       or Has_Inherited_Default_Init_Cond (Id)));
+
+      S := Subprograms_For_Type (Id);
+      Set_Subprograms_For_Type (Id, V);
+      Set_Subprograms_For_Type (V, S);
+
+      --  Check for a duplicate procedure
+
+      while Present (S) loop
+         if Is_Default_Init_Cond_Procedure (S) then
+            raise Program_Error;
+         end if;
+
+         S := Subprograms_For_Type (S);
+      end loop;
+   end Set_Default_Init_Cond_Procedure;
+
    -----------------------------
    -- Set_Invariant_Procedure --
    -----------------------------
@@ -8252,6 +8339,7 @@ package body Einfo is
       W ("Has_Controlling_Result",          Flag98  (Id));
       W ("Has_Convention_Pragma",           Flag119 (Id));
       W ("Has_Default_Aspect",              Flag39  (Id));
+      W ("Has_Default_Init_Cond",           Flag3   (Id));
       W ("Has_Delayed_Aspects",             Flag200 (Id));
       W ("Has_Delayed_Freeze",              Flag18  (Id));
       W ("Has_Delayed_Rep_Aspects",         Flag261 (Id));
@@ -8267,6 +8355,7 @@ package body Einfo is
       W ("Has_Implicit_Dereference",        Flag251 (Id));
       W ("Has_Independent_Components",      Flag34  (Id));
       W ("Has_Inheritable_Invariants",      Flag248 (Id));
+      W ("Has_Inherited_Default_Init_Cond", Flag133 (Id));
       W ("Has_Initial_Value",               Flag219 (Id));
       W ("Has_Invariants",                  Flag232 (Id));
       W ("Has_Loop_Entry_Attributes",       Flag260 (Id));
@@ -8327,8 +8416,7 @@ package body Einfo is
       W ("In_Private_Part",                 Flag45  (Id));
       W ("In_Use",                          Flag8   (Id));
       W ("Is_Abstract_Subprogram",          Flag19  (Id));
-      W ("Is_Abstract_Type",                Flag146  (Id));
-      W ("Is_Local_Anonymous_Access",       Flag194 (Id));
+      W ("Is_Abstract_Type",                Flag146 (Id));
       W ("Is_Access_Constant",              Flag69  (Id));
       W ("Is_Ada_2005_Only",                Flag185 (Id));
       W ("Is_Ada_2012_Only",                Flag199 (Id));
@@ -8350,6 +8438,7 @@ package body Einfo is
       W ("Is_Constructor",                  Flag76  (Id));
       W ("Is_Controlled",                   Flag42  (Id));
       W ("Is_Controlling_Formal",           Flag97  (Id));
+      W ("Is_Default_Init_Cond_Procedure",  Flag132 (Id));
       W ("Is_Descendent_Of_Address",        Flag223 (Id));
       W ("Is_Discrim_SO_Function",          Flag176 (Id));
       W ("Is_Discriminant_Check_Function",  Flag264 (Id));
@@ -8388,6 +8477,7 @@ package body Einfo is
       W ("Is_Limited_Composite",            Flag106 (Id));
       W ("Is_Limited_Interface",            Flag197 (Id));
       W ("Is_Limited_Record",               Flag25  (Id));
+      W ("Is_Local_Anonymous_Access",       Flag194 (Id));
       W ("Is_Machine_Code_Subprogram",      Flag137 (Id));
       W ("Is_Non_Static_Subtype",           Flag109 (Id));
       W ("Is_Null_Init_Proc",               Flag178 (Id));
index 9c5a2ca03d06afd0abe4ff70f3dbd5455b324370..c87a9899a001ad86c8ebffa4ae38e54ca997f57b 100644 (file)
@@ -772,6 +772,16 @@ package Einfo is
 --       default expressions (see Freeze.Process_Default_Expressions), which
 --       would not only waste time, but also generate false error messages.
 
+--    Default_Init_Cond_Procedure (synthesized)
+--       Defined in all types. Set for private [sub]types subject to pragma
+--       Default_Initial_Condition, their corresponding full views and derived
+--       types with at least one parent subject to the pragma. Contains the
+--       entity of the procedure which takes a single argument of the given
+--       type and verifies the assumption of the pragma.
+--
+--       Note: the reason this is marked as a synthesized attribute is that the
+--       way this is stored is as an element of the Subprograms_For_Type field.
+
 --    Default_Value (Node20)
 --       Defined in formal parameters. Points to the node representing the
 --       expression for the default value for the parameter. Empty if the
@@ -1474,6 +1484,17 @@ package Einfo is
 --       Convention, Import, or Export has been given. Used to prevent more
 --       than one such pragma appearing for a given entity (RM B.1(45)).
 
+--    Has_Default_Aspect (Flag39) [base type only]
+--       Defined in entities for types and subtypes, set for scalar types with
+--       a Default_Value aspect and array types with a Default_Component_Value
+--       apsect. If this flag is set, then a corresponding aspect specification
+--       node will be present on the rep item chain for the entity.
+
+--    Has_Default_Init_Cond (Flag3)
+--       Defined in type and subtype entities. Set if pragma Default_Initial_
+--       Condition applies to the type or subtype. This flag must be mutually
+--       exclusive with Has_Inherited_Default_Init_Cond.
+
 --    Has_Delayed_Aspects (Flag200)
 --      Defined in all entities. Set if the Rep_Item chain for the entity has
 --      one or more N_Aspect_Definition nodes chained which are not to be
@@ -1486,12 +1507,6 @@ package Einfo is
 --       node must be generated for the entity at its freezing point. See
 --       separate section ("Delayed Freezing and Elaboration") for details.
 
---    Has_Default_Aspect (Flag39) [base type only]
---       Defined in entities for types and subtypes, set for scalar types with
---       a Default_Value aspect and array types with a Default_Component_Value
---       apsect. If this flag is set, then a corresponding aspect specification
---       node will be present on the rep item chain for the entity.
-
 --    Has_Delayed_Rep_Aspects (Flag261)
 --       Defined in all type and subtypes. This flag is set if there is at
 --       least one aspect for a representation characteristic that has to be
@@ -1605,6 +1620,11 @@ package Einfo is
 --       type which has inheritable invariants, and in this case the flag will
 --       also be set in the private type.
 
+--    Has_Inherited_Default_Init_Cond (Flag133)
+--       Defined in type and subtype entities. Set if a derived type inherits
+--       pragma Default_Initial_Condition from its parent type. This flag must
+--       be mutually exclusive with Had_Default_Init_Cond.
+
 --    Has_Initial_Value (Flag219)
 --       Defined in entities for variables and out parameters. Set if there
 --       is an explicit initial value expression in the declaration of the
@@ -2255,6 +2275,10 @@ package Einfo is
 --       Applies to all type entities, true for decimal fixed point
 --       types and subtypes.
 
+--    Is_Default_Init_Cond_Procedure (Flag132)
+--       Defined in functions and procedures. Set for a generated procedure
+--       which verifies the assumption of pragma Default_Initial_Condition.
+
 --    Is_Descendent_Of_Address (Flag223)
 --       Defined in all entities. True if the entity is type System.Address,
 --       or (recursively) a subtype or derived type of System.Address.
@@ -5230,11 +5254,13 @@ package Einfo is
    --    Has_Constrained_Partial_View        (Flag187)
    --    Has_Controlled_Component            (Flag43)   (base type only)
    --    Has_Default_Aspect                  (Flag39)   (base type only)
+   --    Has_Default_Init_Cond               (Flag3)
    --    Has_Delayed_Rep_Aspects             (Flag261)
    --    Has_Discriminants                   (Flag5)
    --    Has_Dynamic_Predicate_Aspect        (Flag258)
    --    Has_Independent_Components          (Flag34)   (base type only)
    --    Has_Inheritable_Invariants          (Flag248)
+   --    Has_Inherited_Default_Init_Cond     (Flag133)
    --    Has_Invariants                      (Flag232)
    --    Has_Non_Standard_Rep                (Flag75)   (base type only)
    --    Has_Object_Size_Clause              (Flag172)
@@ -5286,6 +5312,7 @@ package Einfo is
 
    --    Alignment_Clause                    (synth)
    --    Base_Type                           (synth)
+   --    Default_Init_Cond_Procedure         (synth)
    --    Implementation_Base_Type            (synth)
    --    Invariant_Procedure                 (synth)
    --    Is_Access_Protected_Subprogram_Type (synth)
@@ -5953,6 +5980,7 @@ package Einfo is
    --    Is_Asynchronous                     (Flag81)
    --    Is_Called                           (Flag102)  (non-generic case only)
    --    Is_Constructor                      (Flag76)
+   --    Is_Default_Init_Cond_Procedure      (Flag132)  (non-generic case only)
    --    Is_Eliminated                       (Flag124)
    --    Is_Generic_Actual_Subprogram        (Flag274)  (non-generic case only)
    --    Is_Hidden_Non_Overridden_Subpgm     (Flag2)    (non-generic case only)
@@ -6550,6 +6578,7 @@ package Einfo is
    function Has_Controlling_Result              (Id : E) return B;
    function Has_Convention_Pragma               (Id : E) return B;
    function Has_Default_Aspect                  (Id : E) return B;
+   function Has_Default_Init_Cond               (Id : E) return B;
    function Has_Delayed_Aspects                 (Id : E) return B;
    function Has_Delayed_Freeze                  (Id : E) return B;
    function Has_Delayed_Rep_Aspects             (Id : E) return B;
@@ -6565,6 +6594,7 @@ package Einfo is
    function Has_Implicit_Dereference            (Id : E) return B;
    function Has_Independent_Components          (Id : E) return B;
    function Has_Inheritable_Invariants          (Id : E) return B;
+   function Has_Inherited_Default_Init_Cond     (Id : E) return B;
    function Has_Initial_Value                   (Id : E) return B;
    function Has_Interrupt_Handler               (Id : E) return B;
    function Has_Invariants                      (Id : E) return B;
@@ -6655,6 +6685,7 @@ package Einfo is
    function Is_Constructor                      (Id : E) return B;
    function Is_Controlled                       (Id : E) return B;
    function Is_Controlling_Formal               (Id : E) return B;
+   function Is_Default_Init_Cond_Procedure      (Id : E) return B;
    function Is_Descendent_Of_Address            (Id : E) return B;
    function Is_Discrim_SO_Function              (Id : E) return B;
    function Is_Discriminant_Check_Function      (Id : E) return B;
@@ -7183,6 +7214,7 @@ package Einfo is
    procedure Set_Has_Controlling_Result          (Id : E; V : B := True);
    procedure Set_Has_Convention_Pragma           (Id : E; V : B := True);
    procedure Set_Has_Default_Aspect              (Id : E; V : B := True);
+   procedure Set_Has_Default_Init_Cond           (Id : E; V : B := True);
    procedure Set_Has_Delayed_Aspects             (Id : E; V : B := True);
    procedure Set_Has_Delayed_Freeze              (Id : E; V : B := True);
    procedure Set_Has_Delayed_Rep_Aspects         (Id : E; V : B := True);
@@ -7198,6 +7230,7 @@ package Einfo is
    procedure Set_Has_Implicit_Dereference        (Id : E; V : B := True);
    procedure Set_Has_Independent_Components      (Id : E; V : B := True);
    procedure Set_Has_Inheritable_Invariants      (Id : E; V : B := True);
+   procedure Set_Has_Inherited_Default_Init_Cond (Id : E; V : B := True);
    procedure Set_Has_Initial_Value               (Id : E; V : B := True);
    procedure Set_Has_Invariants                  (Id : E; V : B := True);
    procedure Set_Has_Loop_Entry_Attributes       (Id : E; V : B := True);
@@ -7288,6 +7321,7 @@ package Einfo is
    procedure Set_Is_Constructor                  (Id : E; V : B := True);
    procedure Set_Is_Controlled                   (Id : E; V : B := True);
    procedure Set_Is_Controlling_Formal           (Id : E; V : B := True);
+   procedure Set_Is_Default_Init_Cond_Procedure  (Id : E; V : B := True);
    procedure Set_Is_Descendent_Of_Address        (Id : E; V : B := True);
    procedure Set_Is_Discrim_SO_Function          (Id : E; V : B := True);
    procedure Set_Is_Discriminant_Check_Function  (Id : E; V : B := True);
@@ -7502,10 +7536,12 @@ package Einfo is
    -- Access to Subprograms in Subprograms_For_Type --
    ---------------------------------------------------
 
-   function Invariant_Procedure                 (Id : E) return N;
-   function Predicate_Function                  (Id : E) return N;
-   function Predicate_Function_M                (Id : E) return N;
+   function Default_Init_Cond_Procedure         (Id : E) return E;
+   function Invariant_Procedure                 (Id : E) return E;
+   function Predicate_Function                  (Id : E) return E;
+   function Predicate_Function_M                (Id : E) return E;
 
+   procedure Set_Default_Init_Cond_Procedure    (Id : E; V : E);
    procedure Set_Invariant_Procedure            (Id : E; V : E);
    procedure Set_Predicate_Function             (Id : E; V : E);
    procedure Set_Predicate_Function_M           (Id : E; V : E);
@@ -7929,6 +7965,7 @@ package Einfo is
    pragma Inline (Has_Controlling_Result);
    pragma Inline (Has_Convention_Pragma);
    pragma Inline (Has_Default_Aspect);
+   pragma Inline (Has_Default_Init_Cond);
    pragma Inline (Has_Delayed_Aspects);
    pragma Inline (Has_Delayed_Freeze);
    pragma Inline (Has_Delayed_Rep_Aspects);
@@ -7944,6 +7981,7 @@ package Einfo is
    pragma Inline (Has_Implicit_Dereference);
    pragma Inline (Has_Independent_Components);
    pragma Inline (Has_Inheritable_Invariants);
+   pragma Inline (Has_Inherited_Default_Init_Cond);
    pragma Inline (Has_Initial_Value);
    pragma Inline (Has_Invariants);
    pragma Inline (Has_Loop_Entry_Attributes);
@@ -8044,6 +8082,7 @@ package Einfo is
    pragma Inline (Is_Controlled);
    pragma Inline (Is_Controlling_Formal);
    pragma Inline (Is_Decimal_Fixed_Point_Type);
+   pragma Inline (Is_Default_Init_Cond_Procedure);
    pragma Inline (Is_Descendent_Of_Address);
    pragma Inline (Is_Digits_Type);
    pragma Inline (Is_Discrete_Or_Fixed_Point_Type);
@@ -8409,6 +8448,7 @@ package Einfo is
    pragma Inline (Set_Has_Controlling_Result);
    pragma Inline (Set_Has_Convention_Pragma);
    pragma Inline (Set_Has_Default_Aspect);
+   pragma Inline (Set_Has_Default_Init_Cond);
    pragma Inline (Set_Has_Delayed_Aspects);
    pragma Inline (Set_Has_Delayed_Freeze);
    pragma Inline (Set_Has_Delayed_Rep_Aspects);
@@ -8424,6 +8464,7 @@ package Einfo is
    pragma Inline (Set_Has_Implicit_Dereference);
    pragma Inline (Set_Has_Independent_Components);
    pragma Inline (Set_Has_Inheritable_Invariants);
+   pragma Inline (Set_Has_Inherited_Default_Init_Cond);
    pragma Inline (Set_Has_Initial_Value);
    pragma Inline (Set_Has_Invariants);
    pragma Inline (Set_Has_Loop_Entry_Attributes);
@@ -8513,6 +8554,7 @@ package Einfo is
    pragma Inline (Set_Is_Constructor);
    pragma Inline (Set_Is_Controlled);
    pragma Inline (Set_Is_Controlling_Formal);
+   pragma Inline (Set_Is_Default_Init_Cond_Procedure);
    pragma Inline (Set_Is_Descendent_Of_Address);
    pragma Inline (Set_Is_Discrim_SO_Function);
    pragma Inline (Set_Is_Discriminant_Check_Function);
index e87a8404f8d6cf9a7c8324c705daba65dddbfd0b..868f9e1b01ec8dfc1374b29184e62f61c5e978d2 100644 (file)
@@ -165,11 +165,6 @@ package body Exp_Ch3 is
    --  needed after an initialization. Typ is the component type, and Proc_Id
    --  the initialization procedure for the enclosing composite type.
 
-   procedure Expand_Tagged_Root (T : Entity_Id);
-   --  Add a field _Tag at the beginning of the record. This field carries
-   --  the value of the access to the Dispatch table. This procedure is only
-   --  called on root type, the _Tag field being inherited by the descendants.
-
    procedure Expand_Freeze_Array_Type (N : Node_Id);
    --  Freeze an array type. Deals with building the initialization procedure,
    --  creating the packed array type for a packed array and also with the
@@ -193,6 +188,11 @@ package body Exp_Ch3 is
    --  applies only to E_Record_Type entities, not to class wide types,
    --  record subtypes, or private types.
 
+   procedure Expand_Tagged_Root (T : Entity_Id);
+   --  Add a field _Tag at the beginning of the record. This field carries
+   --  the value of the access to the Dispatch table. This procedure is only
+   --  called on root type, the _Tag field being inherited by the descendants.
+
    procedure Freeze_Stream_Operations (N : Node_Id; Typ : Entity_Id);
    --  Treat user-defined stream operations as renaming_as_body if the
    --  subprogram they rename is not frozen when the type is frozen.
@@ -632,19 +632,20 @@ package body Exp_Ch3 is
 
             return New_List (
               Make_Implicit_Loop_Statement (Nod,
-                Identifier => Empty,
+                Identifier       => Empty,
                 Iteration_Scheme =>
                   Make_Iteration_Scheme (Loc,
                     Loop_Parameter_Specification =>
                       Make_Loop_Parameter_Specification (Loc,
-                        Defining_Identifier => Index,
+                        Defining_Identifier         => Index,
                         Discrete_Subtype_Definition =>
                           Make_Attribute_Reference (Loc,
-                            Prefix => Make_Identifier (Loc, Name_uInit),
+                            Prefix          =>
+                              Make_Identifier (Loc, Name_uInit),
                             Attribute_Name  => Name_Range,
                             Expressions     => New_List (
                               Make_Integer_Literal (Loc, N))))),
-                Statements =>  Init_One_Dimension (N + 1)));
+                Statements       => Init_One_Dimension (N + 1)));
          end if;
       end Init_One_Dimension;
 
@@ -4664,7 +4665,6 @@ package body Exp_Ch3 is
    ------------------------------------
 
    procedure Expand_N_Full_Type_Declaration (N : Node_Id) is
-
       procedure Build_Master (Ptr_Typ : Entity_Id);
       --  Create the master associated with Ptr_Typ
 
@@ -5313,6 +5313,7 @@ package body Exp_Ch3 is
 
       --  Local variables
 
+      Next_N  : constant Node_Id := Next (N);
       Id_Ref  : Node_Id;
       New_Ref : Node_Id;
 
@@ -5563,7 +5564,7 @@ package body Exp_Ch3 is
                   --  by
                   --     Tmp : T := Obj;
                   --     type Ityp is not null access I'Class;
-                  --     CW  : I'Class renames Ityp(Tmp.I_Tag'Address).all;
+                  --     CW  : I'Class renames Ityp (Tmp.I_Tag'Address).all;
 
                   if Comes_From_Source (Expr_N)
                     and then Nkind (Expr_N) = N_Identifier
@@ -5672,7 +5673,8 @@ package body Exp_Ch3 is
                     Make_Object_Renaming_Declaration (Loc,
                       Defining_Identifier => Make_Temporary (Loc, 'D'),
                       Subtype_Mark        => New_Occurrence_Of (Typ, Loc),
-                      Name => Convert_Tag_To_Interface (Typ, Tag_Comp)));
+                      Name                =>
+                        Convert_Tag_To_Interface (Typ, Tag_Comp)));
 
                   --  If the original entity comes from source, then mark the
                   --  new entity as needing debug information, even though it's
@@ -6026,6 +6028,37 @@ package body Exp_Ch3 is
          end;
       end if;
 
+      --  At this point the object is fully initialized by either invoking the
+      --  related type init proc, routine [Deep_]Initialize or performing in-
+      --  place assingments for an array object. If the related type is subject
+      --  to pragma Default_Initial_Condition, add a runtime check to verify
+      --  the assumption of the pragma. Generate:
+
+      --    <Base_Typ>Default_Init_Cond (<Base_Typ> (Def_Id));
+
+      --  Note that the check is generated for source objects only
+
+      if Comes_From_Source (Def_Id)
+        and then (Has_Default_Init_Cond (Base_Typ)
+                    or else Has_Inherited_Default_Init_Cond (Base_Typ))
+      then
+         declare
+            DIC_Call : constant Node_Id :=
+                         Build_Default_Init_Cond_Call (Loc, Def_Id, Base_Typ);
+         begin
+            if Present (Next_N) then
+               Insert_Before_And_Analyze (Next_N, DIC_Call);
+
+            --  The object declaration is the last node in a declarative or a
+            --  statement list.
+
+            else
+               Append_To (List_Containing (N), DIC_Call);
+               Analyze (DIC_Call);
+            end if;
+         end;
+      end if;
+
    --  Exception on library entity not available
 
    exception
@@ -7357,14 +7390,27 @@ package body Exp_Ch3 is
             end loop;
          end;
 
-         if RACW_Seen then
-
-            --  If there are RACWs designating this type, make stubs now
+         --  If there are RACWs designating this type, make stubs now
 
+         if RACW_Seen then
             Remote_Types_Tagged_Full_View_Encountered (Def_Id);
          end if;
       end if;
 
+      --  If the type is subject to pragma Default_Initial_Condition, generate
+      --  the body of the procedure which verifies the assertion of the pragma
+      --  at runtime.
+
+      if Has_Default_Init_Cond (Def_Id) then
+         Build_Default_Init_Cond_Procedure_Body (Def_Id);
+
+      --  A derived type inherits the default initial condition procedure from
+      --  its parent type.
+
+      elsif Has_Inherited_Default_Init_Cond (Def_Id) then
+         Inherit_Default_Init_Cond_Procedure (Def_Id);
+      end if;
+
       --  Freeze processing for record types
 
       if Is_Record_Type (Def_Id) then
index e2951801f8ca9c76447d13cbc7313d3f8c2ec3e9..b98aed6bbab7afa3804ad6e8f1d10979c092ad64 100644 (file)
@@ -38,6 +38,7 @@ with Exp_Ch11; use Exp_Ch11;
 with Exp_Dbug; use Exp_Dbug;
 with Exp_Dist; use Exp_Dist;
 with Exp_Disp; use Exp_Disp;
+with Exp_Prag; use Exp_Prag;
 with Exp_Tss;  use Exp_Tss;
 with Exp_Util; use Exp_Util;
 with Freeze;   use Freeze;
@@ -379,11 +380,6 @@ package body Exp_Ch7 is
    --  Given an arbitrary entity, traverse the scope chain looking for the
    --  first enclosing function. Return Empty if no function was found.
 
-   procedure Expand_Pragma_Initial_Condition (N : Node_Id);
-   --  Subsidiary to the expansion of package specs and bodies. Generate a
-   --  runtime check needed to verify the assumption introduced by pragma
-   --  Initial_Condition. N denotes the package spec or body.
-
    function Make_Call
      (Loc       : Source_Ptr;
       Proc_Id   : Entity_Id;
@@ -4263,88 +4259,6 @@ package body Exp_Ch7 is
       end if;
    end Expand_N_Package_Declaration;
 
-   -------------------------------------
-   -- Expand_Pragma_Initial_Condition --
-   -------------------------------------
-
-   procedure Expand_Pragma_Initial_Condition (N : Node_Id) is
-      Loc       : constant Source_Ptr := Sloc (N);
-      Check     : Node_Id;
-      Expr      : Node_Id;
-      Init_Cond : Node_Id;
-      List      : List_Id;
-      Pack_Id   : Entity_Id;
-
-   begin
-      if Nkind (N) = N_Package_Body then
-         Pack_Id := Corresponding_Spec (N);
-
-         if Present (Handled_Statement_Sequence (N)) then
-            List := Statements (Handled_Statement_Sequence (N));
-
-         --  The package body lacks statements, create an empty list
-
-         else
-            List := New_List;
-
-            Set_Handled_Statement_Sequence (N,
-              Make_Handled_Sequence_Of_Statements (Loc, Statements => List));
-         end if;
-
-      elsif Nkind (N) = N_Package_Declaration then
-         Pack_Id := Defining_Entity (N);
-
-         if Present (Visible_Declarations (Specification (N))) then
-            List := Visible_Declarations (Specification (N));
-
-         --  The package lacks visible declarations, create an empty list
-
-         else
-            List := New_List;
-
-            Set_Visible_Declarations (Specification (N), List);
-         end if;
-
-      --  This routine should not be used on anything other than packages
-
-      else
-         raise Program_Error;
-      end if;
-
-      Init_Cond := Get_Pragma (Pack_Id, Pragma_Initial_Condition);
-
-      --  The caller should check whether the package is subject to pragma
-      --  Initial_Condition.
-
-      pragma Assert (Present (Init_Cond));
-
-      Expr :=
-        Get_Pragma_Arg (First (Pragma_Argument_Associations (Init_Cond)));
-
-      --  The assertion expression was found to be illegal, do not generate the
-      --  runtime check as it will repeat the illegality.
-
-      if Error_Posted (Init_Cond) or else Error_Posted (Expr) then
-         return;
-      end if;
-
-      --  Generate:
-      --    pragma Check (Initial_Condition, <Expr>);
-
-      Check :=
-        Make_Pragma (Loc,
-          Chars                        => Name_Check,
-          Pragma_Argument_Associations => New_List (
-            Make_Pragma_Argument_Association (Loc,
-              Expression => Make_Identifier (Loc, Name_Initial_Condition)),
-
-            Make_Pragma_Argument_Association (Loc,
-              Expression => New_Copy_Tree (Expr))));
-
-      Append_To (List, Check);
-      Analyze (Check);
-   end Expand_Pragma_Initial_Condition;
-
    -----------------------------
    -- Find_Node_To_Be_Wrapped --
    -----------------------------
index 181629429075f23b11193c129af4ac1bb8f6e2ca..bb4bcae192042eb6cf6b1797489e15f7f174e769 100644 (file)
@@ -1152,17 +1152,17 @@ package body Exp_Prag is
       --  Insert the pragma
 
       Insert_After_And_Analyze (N,
-         Make_Pragma (Loc,
-           Chars                        => Name_Machine_Attribute,
-           Pragma_Argument_Associations => New_List (
-             Make_Pragma_Argument_Association (Iloc,
-               Expression => New_Copy_Tree (Internal)),
-             Make_Pragma_Argument_Association (Eloc,
-               Expression =>
-                 Make_String_Literal (Sloc => Ploc,
-                   Strval => "common_object")),
-             Make_Pragma_Argument_Association (Ploc,
-               Expression => New_Copy_Tree (Psect)))));
+        Make_Pragma (Loc,
+          Chars                        => Name_Machine_Attribute,
+          Pragma_Argument_Associations => New_List (
+            Make_Pragma_Argument_Association (Iloc,
+              Expression => New_Copy_Tree (Internal)),
+            Make_Pragma_Argument_Association (Eloc,
+              Expression =>
+                Make_String_Literal (Sloc => Ploc,
+                  Strval => "common_object")),
+            Make_Pragma_Argument_Association (Ploc,
+              Expression => New_Copy_Tree (Psect)))));
    end Expand_Pragma_Common_Object;
 
    ---------------------------------------
@@ -1283,6 +1283,88 @@ package body Exp_Prag is
       end if;
    end Expand_Pragma_Import_Or_Interface;
 
+   -------------------------------------
+   -- Expand_Pragma_Initial_Condition --
+   -------------------------------------
+
+   procedure Expand_Pragma_Initial_Condition (Spec_Or_Body : Node_Id) is
+      Loc       : constant Source_Ptr := Sloc (Spec_Or_Body);
+      Check     : Node_Id;
+      Expr      : Node_Id;
+      Init_Cond : Node_Id;
+      List      : List_Id;
+      Pack_Id   : Entity_Id;
+
+   begin
+      if Nkind (Spec_Or_Body) = N_Package_Body then
+         Pack_Id := Corresponding_Spec (Spec_Or_Body);
+
+         if Present (Handled_Statement_Sequence (Spec_Or_Body)) then
+            List := Statements (Handled_Statement_Sequence (Spec_Or_Body));
+
+         --  The package body lacks statements, create an empty list
+
+         else
+            List := New_List;
+
+            Set_Handled_Statement_Sequence (Spec_Or_Body,
+              Make_Handled_Sequence_Of_Statements (Loc, Statements => List));
+         end if;
+
+      elsif Nkind (Spec_Or_Body) = N_Package_Declaration then
+         Pack_Id := Defining_Entity (Spec_Or_Body);
+
+         if Present (Visible_Declarations (Specification (Spec_Or_Body))) then
+            List := Visible_Declarations (Specification (Spec_Or_Body));
+
+         --  The package lacks visible declarations, create an empty list
+
+         else
+            List := New_List;
+
+            Set_Visible_Declarations (Specification (Spec_Or_Body), List);
+         end if;
+
+      --  This routine should not be used on anything other than packages
+
+      else
+         raise Program_Error;
+      end if;
+
+      Init_Cond := Get_Pragma (Pack_Id, Pragma_Initial_Condition);
+
+      --  The caller should check whether the package is subject to pragma
+      --  Initial_Condition.
+
+      pragma Assert (Present (Init_Cond));
+
+      Expr :=
+        Get_Pragma_Arg (First (Pragma_Argument_Associations (Init_Cond)));
+
+      --  The assertion expression was found to be illegal, do not generate the
+      --  runtime check as it will repeat the illegality.
+
+      if Error_Posted (Init_Cond) or else Error_Posted (Expr) then
+         return;
+      end if;
+
+      --  Generate:
+      --    pragma Check (Initial_Condition, <Expr>);
+
+      Check :=
+        Make_Pragma (Loc,
+          Chars                        => Name_Check,
+          Pragma_Argument_Associations => New_List (
+            Make_Pragma_Argument_Association (Loc,
+              Expression => Make_Identifier (Loc, Name_Initial_Condition)),
+
+            Make_Pragma_Argument_Association (Loc,
+              Expression => New_Copy_Tree (Expr))));
+
+      Append_To (List, Check);
+      Analyze (Check);
+   end Expand_Pragma_Initial_Condition;
+
    ------------------------------------
    -- Expand_Pragma_Inspection_Point --
    ------------------------------------
index 681f1160dea6b22ae10dadcfea11939504cc2f60..d1ddfea177e5d5d6b5ce48d8967e436b8092e7cd 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2013, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2014, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -42,4 +42,15 @@ package Exp_Prag is
    --  Subp_Id's body. All generated code is added to list Stmts. If Stmts is
    --  No_List on entry, a new list is created.
 
+   procedure Expand_Pragma_Initial_Condition (Spec_Or_Body : Node_Id);
+   --  Generate a runtime check needed to verify the assumption of introduced
+   --  by pragma Initial_Condition. Spec_Or_Body denotes the spec or body of
+   --  the package where the pragma appears. The check is inserted according
+   --  to the following precedence rules:
+   --    1) If the package has a body with a statement sequence, the check is
+   --       inserted at the end of the statments.
+   --    2) If the package has a body, the check is inserted at the end of the
+   --       body declarations.
+   --    3) The check is inserted at the end of the visible declarations.
+
 end Exp_Prag;
index e0a71c80e0d9cfa413132b07e6a3de138f72db7e..b440122dc621acecc4f7b9224917696954d7a1e7 100644 (file)
@@ -1186,6 +1186,7 @@ begin
            Pragma_Debug_Policy                   |
            Pragma_Depends                        |
            Pragma_Detect_Blocking                |
+           Pragma_Default_Initial_Condition      |
            Pragma_Default_Scalar_Storage_Order   |
            Pragma_Default_Storage_Pool           |
            Pragma_Disable_Atomic_Synchronization |
index 1224270f1f41a53fd62a91d9f11a3514e49f88b6..a6b0b381ff209d1e1406284af4a43c148916343c 100644 (file)
@@ -295,16 +295,17 @@ package body Prj.Strt is
    ---------------------------
 
    procedure End_Case_Construction
-     (Check_All_Labels   : Boolean;
-      Case_Location      : Source_Ptr;
-      Flags              : Processing_Flags;
-      String_Type        : Boolean)
+     (Check_All_Labels : Boolean;
+      Case_Location    : Source_Ptr;
+      Flags            : Processing_Flags;
+      String_Type      : Boolean)
    is
-      Non_Used : Natural := 0;
+      Non_Used       : Natural := 0;
       First_Non_Used : Choice_Node_Id := First_Choice_Node_Id;
+
    begin
-      --  First, if Check_All_Labels is True, check if all values
-      --  of the string type have been used.
+      --  First, if Check_All_Labels is True, check if all values of the string
+      --  type have been used.
 
       if Check_All_Labels then
          if String_Type then
@@ -325,8 +326,7 @@ package body Prj.Strt is
                Error_Msg
                  (Flags, "?value %% is not used as label", Case_Location);
 
-               --  If several are not used, report a warning for each one of
-               --  them.
+            --  If several are not used, report a warning for each one of them
 
             elsif Non_Used > 1 then
                Error_Msg
@@ -355,18 +355,15 @@ package body Prj.Strt is
          Choices.Set_Last (First_Choice_Node_Id);
          Choice_First := 0;
 
-      elsif Choice_Lasts.Last = 2 then
-
-         --  This is the second case construction, set the tables to the first
+      --  Second case construction, set the tables to the first
 
+      elsif Choice_Lasts.Last = 2 then
          Choice_Lasts.Set_Last (1);
          Choices.Set_Last (Choice_Lasts.Table (1));
          Choice_First := 1;
 
+      --  Third or more case construction, set the tables to the previous one
       else
-         --  This is the 3rd or more case construction, set the tables to the
-         --  previous one.
-
          Choice_Lasts.Decrement_Last;
          Choices.Set_Last (Choice_Lasts.Table (Choice_Lasts.Last));
          Choice_First := Choice_Lasts.Table (Choice_Lasts.Last - 1) + 1;
@@ -440,7 +437,6 @@ package body Prj.Strt is
          Scan (In_Tree);
 
          case Token is
-
             when Tok_Right_Paren =>
                if Ext_List then
                   Error_Msg (Flags, "`,` expected", Token_Ptr);
@@ -529,6 +525,7 @@ package body Prj.Strt is
          Set_String_Value_Of (Current_Choice, In_Tree, To => Choice_String);
 
          if String_Type then
+
             --  Check if the label is part of the string type and if it has not
             --  been already used.
 
index 66a96d3e6f7886524f3bb97b6c5130f5801824f1..ab43346ef574255fd2e172a396ec57af6443a6c2 100644 (file)
@@ -50,21 +50,20 @@ private package Prj.Strt is
    procedure Start_New_Case_Construction
      (In_Tree     : Project_Node_Tree_Ref;
       String_Type : Project_Node_Id);
-   --  This procedure is called at the beginning of a case construction The
+   --  This procedure is called at the beginning of a case construction. The
    --  parameter String_Type is the node for the string type of the case label
    --  variable. The different literal strings of the string type are stored
-   --  into a table to be checked against the case labels of the case
-   --  construction.
+   --  into a table to be checked against the labels of the case construction.
 
    procedure End_Case_Construction
-     (Check_All_Labels   : Boolean;
-      Case_Location      : Source_Ptr;
-      Flags              : Processing_Flags;
-      String_Type        : Boolean);
-   --  This procedure is called at the end of a case construction to remove the
-   --  case labels and to restore the previous state. In particular, in the
+     (Check_All_Labels : Boolean;
+      Case_Location    : Source_Ptr;
+      Flags            : Processing_Flags;
+      String_Type      : Boolean);
+   --  This procedure is called at the end of a case construction to remove
+   --  the case labels and to restore the previous state. In particular, in the
    --  case of nested case constructions, the case labels of the enclosing case
-   --  construction are restored. When When_Others is False and we are not in
+   --  construction are restored. If When_Others is False and we are not in
    --  quiet output, a warning is emitted for each value of the case variable
    --  string type that has not been specified.
 
index d11b34e3f190346b2efcc644d32eb360918ec25e..aecb69a4e948c36c574a5336e8146bd0a42aa9ce 100644 (file)
@@ -3191,9 +3191,9 @@ package body Sem_Attr is
       -- Default_Bit_Order --
       -----------------------
 
-      when Attribute_Default_Bit_Order => Default_Bit_Order :
-      declare
+      when Attribute_Default_Bit_Order => Default_Bit_Order : declare
          Target_Default_Bit_Order : System.Bit_Order;
+
       begin
          Check_Standard_Prefix;
 
@@ -3217,6 +3217,7 @@ package body Sem_Attr is
 
       when Attribute_Default_Scalar_Storage_Order => Default_SSO : declare
          RE_Default_SSO : RE_Id;
+
       begin
          Check_Standard_Prefix;
 
@@ -3227,10 +3228,13 @@ package body Sem_Attr is
                else
                   RE_Default_SSO := RE_Low_Order_First;
                end if;
+
             when 'H' =>
                RE_Default_SSO := RE_High_Order_First;
+
             when 'L' =>
                RE_Default_SSO := RE_Low_Order_First;
+
             when others =>
                raise Program_Error;
          end case;
index 3ef583621b7a7eddec031a0b09d4ab2332c18cfb..ca52755190b6d9f81e70076a739b8fa50a1d7829 100644 (file)
@@ -182,17 +182,6 @@ package body Sem_Ch13 is
    --  renaming_as_body. For tagged types, the specification is one of the
    --  primitive specs.
 
-   generic
-      with procedure Replace_Type_Reference (N : Node_Id);
-   procedure Replace_Type_References_Generic (N : Node_Id; T : Entity_Id);
-   --  This is used to scan an expression for a predicate or invariant aspect
-   --  replacing occurrences of the name of the subtype to which the aspect
-   --  applies with appropriate references to the parameter of the predicate
-   --  function or invariant procedure. The procedure passed as a generic
-   --  parameter does the actual replacement of node N, which is either a
-   --  simple direct reference to T, or a selected component that represents
-   --  an appropriately qualified occurrence of T.
-
    procedure Resolve_Iterable_Operation
      (N      : Node_Id;
       Cursor : Entity_Id;
@@ -2221,6 +2210,26 @@ package body Sem_Ch13 is
                   goto Continue;
                end Abstract_State;
 
+               --  Aspect Default_Internal_Condition is never delayed because
+               --  it is equivalent to a source pragma which appears after the
+               --  related private type. To deal with forward references, the
+               --  generated pragma is stored in the rep chain of the related
+               --  private type as types do not carry contracts. The pragma is
+               --  wrapped inside of a procedure at the freeze point of the
+               --  private type's full view.
+
+               when Aspect_Default_Initial_Condition =>
+                  Make_Aitem_Pragma
+                    (Pragma_Argument_Associations => New_List (
+                       Make_Pragma_Argument_Association (Loc,
+                         Expression => Relocate_Node (Expr))),
+                     Pragma_Name                  =>
+                       Name_Default_Initial_Condition);
+
+                  Decorate (Aspect, Aitem);
+                  Insert_Pragma (Aitem);
+                  goto Continue;
+
                --  Depends
 
                --  Aspect Depends is never delayed because it is equivalent to
@@ -8737,25 +8746,26 @@ package body Sem_Ch13 is
 
          --  Here is the list of aspects that don't require delay analysis
 
-         when Aspect_Abstract_State       |
-              Aspect_Annotate             |
-              Aspect_Contract_Cases       |
-              Aspect_Dimension            |
-              Aspect_Dimension_System     |
-              Aspect_Implicit_Dereference |
-              Aspect_Initial_Condition    |
-              Aspect_Initializes          |
-              Aspect_Part_Of              |
-              Aspect_Post                 |
-              Aspect_Postcondition        |
-              Aspect_Pre                  |
-              Aspect_Precondition         |
-              Aspect_Refined_Depends      |
-              Aspect_Refined_Global       |
-              Aspect_Refined_Post         |
-              Aspect_Refined_State        |
-              Aspect_SPARK_Mode           |
-              Aspect_Test_Case            =>
+         when Aspect_Abstract_State            |
+              Aspect_Annotate                  |
+              Aspect_Contract_Cases            |
+              Aspect_Default_Initial_Condition |
+              Aspect_Dimension                 |
+              Aspect_Dimension_System          |
+              Aspect_Implicit_Dereference      |
+              Aspect_Initial_Condition         |
+              Aspect_Initializes               |
+              Aspect_Part_Of                   |
+              Aspect_Post                      |
+              Aspect_Postcondition             |
+              Aspect_Pre                       |
+              Aspect_Precondition              |
+              Aspect_Refined_Depends           |
+              Aspect_Refined_Global            |
+              Aspect_Refined_Post              |
+              Aspect_Refined_State             |
+              Aspect_SPARK_Mode                |
+              Aspect_Test_Case                 =>
             raise Program_Error;
 
       end case;
@@ -10555,9 +10565,10 @@ package body Sem_Ch13 is
         (Rep_Item : Node_Id) return Boolean
       is
       begin
-         return Nkind (Rep_Item) = N_Pragma
-           or else Present_In_Rep_Item
-                     (Entity (Rep_Item), Aspect_Rep_Item (Rep_Item));
+         return
+           Nkind (Rep_Item) = N_Pragma
+             or else Present_In_Rep_Item
+                       (Entity (Rep_Item), Aspect_Rep_Item (Rep_Item));
       end Is_Pragma_Or_Corr_Pragma_Present_In_Rep_Item;
 
    --  Start of processing for Inherit_Aspects_At_Freeze_Point
@@ -11746,7 +11757,7 @@ package body Sem_Ch13 is
                end loop;
             end if;
 
-            --  Continue for any other node kind
+         --  Continue for any other node kind
 
          else
             return OK;
index f666a3f1b430b9d82d300af9e8de56c4c8964f7b..b1bb1592b452b2d905e550538075a28f45db184a 100644 (file)
@@ -144,6 +144,17 @@ package Sem_Ch13 is
    --  type. Returns False if no such error occurs. If this error does occur,
    --  appropriate error messages are posted on node N, and True is returned.
 
+   generic
+      with procedure Replace_Type_Reference (N : Node_Id);
+   procedure Replace_Type_References_Generic (N : Node_Id; T : Entity_Id);
+   --  This is used to scan an expression for a predicate or invariant aspect
+   --  replacing occurrences of the name of the subtype to which the aspect
+   --  applies with appropriate references to the parameter of the predicate
+   --  function or invariant procedure. The procedure passed as a generic
+   --  parameter does the actual replacement of node N, which is either a
+   --  simple direct reference to T, or a selected component that represents
+   --  an appropriately qualified occurrence of T.
+
    function Rep_Item_Too_Late
      (T     : Entity_Id;
       N     : Node_Id;
index 94995d426a524c57bd689170b6bc20bfa2e65cbd..ae09b34f6561667e8effb64d481da1402b1dbef0 100644 (file)
@@ -92,8 +92,8 @@ package body Sem_Ch3 is
    --  record type.
 
    procedure Analyze_Object_Contract (Obj_Id : Entity_Id);
-   --  Analyze all delayed aspects chained on the contract of object Obj_Id as
-   --  if they appeared at the end of the declarative region. The aspects to be
+   --  Analyze all delayed pragmas chained on the contract of object Obj_Id as
+   --  if they appeared at the end of the declarative region. The pragmas to be
    --  considered are:
    --    Async_Readers
    --    Async_Writers
@@ -8508,6 +8508,23 @@ package body Sem_Ch3 is
       end if;
 
       Check_Function_Writable_Actuals (N);
+
+      --  Propagate the attributes related to pragma Default_Initial_Condition
+      --  from the parent type to the private extension. A derived type always
+      --  inherits the default initial condition flag from the parent type. If
+      --  the derived type carries its own Default_Initial_Condition pragma,
+      --  the flag is later reset in Analyze_Pragma. Note that both flags are
+      --  mutually exclusive.
+
+      if Has_Inherited_Default_Init_Cond (Parent_Type)
+        or else Present (Get_Pragma
+                  (Parent_Type, Pragma_Default_Initial_Condition))
+      then
+         Set_Has_Inherited_Default_Init_Cond (Derived_Type);
+
+      elsif Has_Default_Init_Cond (Parent_Type) then
+         Set_Has_Default_Init_Cond (Derived_Type);
+      end if;
    end Build_Derived_Record_Type;
 
    ------------------------
@@ -18945,6 +18962,21 @@ package body Sem_Ch3 is
          Set_Has_Specified_Stream_Output (Full_T);
       end if;
 
+      --  Propagate the attributes related to pragma Default_Initial_Condition
+      --  from the private to the full view. Note that both flags are mutually
+      --  exclusive.
+
+      if Has_Inherited_Default_Init_Cond (Priv_T) then
+         Set_Has_Inherited_Default_Init_Cond (Full_T);
+         Set_Default_Init_Cond_Procedure
+           (Full_T, Default_Init_Cond_Procedure (Priv_T));
+
+      elsif Has_Default_Init_Cond (Priv_T) then
+         Set_Has_Default_Init_Cond (Full_T);
+         Set_Default_Init_Cond_Procedure
+           (Full_T, Default_Init_Cond_Procedure (Priv_T));
+      end if;
+
       --  Propagate invariants to full type
 
       if Has_Invariants (Priv_T) then
index 722825ed2e2f9959b0b115a6fd2a11b7c78e39e6..e8991328c44c96652fedfa4516e7bb4f5e4e91ba 100644 (file)
@@ -1350,8 +1350,10 @@ package body Sem_Ch7 is
          Analyze_Declarations (Vis_Decls);
       end if;
 
-      --  Verify that incomplete types have received full declarations and
-      --  also build invariant procedures for any types with invariants.
+      --  Inspect the entities defined in the package and ensure that all
+      --  incomplete types have received full declarations. Build default
+      --  initial condition and invariant procedures for all types that
+      --  qualify.
 
       E := First_Entity (Id);
       while Present (E) loop
@@ -1367,10 +1369,26 @@ package body Sem_Ch7 is
             Error_Msg_N ("no declaration in visible part for incomplete}", E);
          end if;
 
-         --  Build invariant procedures
+         if Is_Type (E) then
 
-         if Is_Type (E) and then Has_Invariants (E) then
-            Build_Invariant_Procedure (E, N);
+            --  Each private type subject to pragma Default_Initial_Condition
+            --  declares a specialized procedure which verifies the assumption
+            --  of the pragma. The declaration appears in the visible part of
+            --  the package to allow for being called from the outside.
+
+            if Has_Default_Init_Cond (E) then
+               Build_Default_Init_Cond_Procedure_Declaration (E);
+
+            --  A private extension inherits the default initial condition
+            --  procedure from its parent type.
+
+            elsif Has_Inherited_Default_Init_Cond (E) then
+               Inherit_Default_Init_Cond_Procedure (E);
+            end if;
+
+            if Has_Invariants (E) then
+               Build_Invariant_Procedure (E, N);
+            end if;
          end if;
 
          Next_Entity (E);
index 6b94a8b2873f752e2c5b6413d3174218b4cbcd19..82d7df496025aca4ff9a60b87ca6b9731c16e078 100644 (file)
@@ -2363,7 +2363,7 @@ package body Sem_Prag is
       --  final place yet. A direct analysis may generate side effects and this
       --  is not desired at this point.
 
-      Preanalyze_And_Resolve (Expr, Standard_Boolean);
+      Preanalyze_Assert_Expression (Expr, Standard_Boolean);
    end Analyze_Initial_Condition_In_Decl_Part;
 
    --------------------------------------
@@ -11016,17 +11016,18 @@ package body Sem_Prag is
          --                        Type_Invariant       |
          --                        Type_Invariant'Class
 
-         --  ID_ASSERTION_KIND ::= Assert_And_Cut       |
-         --                        Assume               |
-         --                        Contract_Cases       |
-         --                        Debug                |
-         --                        Initial_Condition    |
-         --                        Loop_Invariant       |
-         --                        Loop_Variant         |
-         --                        Postcondition        |
-         --                        Precondition         |
-         --                        Predicate            |
-         --                        Refined_Post         |
+         --  ID_ASSERTION_KIND ::= Assert_And_Cut            |
+         --                        Assume                    |
+         --                        Contract_Cases            |
+         --                        Debug                     |
+         --                        Default_Initial_Condition |
+         --                        Initial_Condition         |
+         --                        Loop_Invariant            |
+         --                        Loop_Variant              |
+         --                        Postcondition             |
+         --                        Precondition              |
+         --                        Predicate                 |
+         --                        Refined_Post              |
          --                        Statement_Assertions
 
          --  Note: The RM_ASSERTION_KIND list is language-defined, and the
@@ -12755,100 +12756,66 @@ package body Sem_Prag is
                     Expression => Get_Pragma_Arg (Arg1)))));
             Analyze (N);
 
-         -------------
-         -- Depends --
-         -------------
-
-         --  pragma Depends (DEPENDENCY_RELATION);
-
-         --  DEPENDENCY_RELATION ::=
-         --    null
-         --  | DEPENDENCY_CLAUSE {, DEPENDENCY_CLAUSE}
-
-         --  DEPENDENCY_CLAUSE ::=
-         --    OUTPUT_LIST =>[+] INPUT_LIST
-         --  | NULL_DEPENDENCY_CLAUSE
-
-         --  NULL_DEPENDENCY_CLAUSE ::= null => INPUT_LIST
-
-         --  OUTPUT_LIST ::= OUTPUT | (OUTPUT {, OUTPUT})
-
-         --  INPUT_LIST ::= null | INPUT | (INPUT {, INPUT})
-
-         --  OUTPUT ::= NAME | FUNCTION_RESULT
-         --  INPUT  ::= NAME
+         --------------------------------------
+         -- Pragma_Default_Initial_Condition --
+         --------------------------------------
 
-         --  where FUNCTION_RESULT is a function Result attribute_reference
+         --  pragma Pragma_Default_Initial_Condition
+         --           [ (null | boolean_EXPRESSION) ];
 
-         when Pragma_Depends => Depends : declare
-            Subp_Decl : Node_Id;
+         when Pragma_Default_Initial_Condition => Default_Init_Cond : declare
+            Discard : Boolean;
+            Stmt    : Node_Id;
+            Typ     : Entity_Id;
 
          begin
             GNAT_Pragma;
-            Check_Arg_Count (1);
-            Ensure_Aggregate_Form (Arg1);
-
-            --  Ensure the proper placement of the pragma. Depends must be
-            --  associated with a subprogram declaration or a body that acts
-            --  as a spec.
-
-            Subp_Decl :=
-              Find_Related_Subprogram_Or_Body (N, Do_Checks => True);
-
-            if Nkind (Subp_Decl) = N_Subprogram_Declaration then
-               null;
-
-            --  Body acts as spec
+            Check_At_Most_N_Arguments (1);
 
-            elsif Nkind (Subp_Decl) = N_Subprogram_Body
-              and then No (Corresponding_Spec (Subp_Decl))
-            then
-               null;
+            Stmt := Prev (N);
+            while Present (Stmt) loop
 
-            --  Body stub acts as spec
+               --  Skip prior pragmas, but check for duplicates
 
-            elsif Nkind (Subp_Decl) = N_Subprogram_Body_Stub
-              and then No (Corresponding_Spec_Of_Stub (Subp_Decl))
-            then
-               null;
+               if Nkind (Stmt) = N_Pragma then
+                  if Pragma_Name (Stmt) = Pname then
+                     Error_Msg_Name_1 := Pname;
+                     Error_Msg_Sloc   := Sloc (Stmt);
+                     Error_Msg_N ("pragma % duplicates pragma declared #", N);
+                  end if;
 
-            else
-               Pragma_Misplaced;
-               return;
-            end if;
+               --  Skip internally generated code
 
-            --  When the pragma appears on a subprogram body, perform the full
-            --  analysis now.
+               elsif not Comes_From_Source (Stmt) then
+                  null;
 
-            if Nkind (Subp_Decl) = N_Subprogram_Body then
-               Analyze_Depends_In_Decl_Part (N);
+               --  The associated private type [extension] has been found, stop
+               --  the search.
 
-            --  When Depends applies to a subprogram compilation unit, the
-            --  corresponding pragma is placed after the unit's declaration
-            --  node and needs to be analyzed immediately.
+               elsif Nkind_In (Stmt, N_Private_Extension_Declaration,
+                                     N_Private_Type_Declaration)
+               then
+                  Typ := Defining_Entity (Stmt);
+                  exit;
 
-            elsif Nkind (Subp_Decl) = N_Subprogram_Declaration
-              and then Nkind (Parent (Subp_Decl)) = N_Compilation_Unit
-            then
-               Analyze_Depends_In_Decl_Part (N);
-            end if;
+               --  The pragma does not apply to a legal construct, issue an
+               --  error and stop the analysis.
 
-            --  Chain the pragma on the contract for further processing
+               else
+                  Pragma_Misplaced;
+                  return;
+               end if;
 
-            Add_Contract_Item (N, Defining_Entity (Subp_Decl));
-         end Depends;
+               Stmt := Prev (Stmt);
+            end loop;
 
-         ---------------------
-         -- Detect_Blocking --
-         ---------------------
+            Set_Has_Default_Init_Cond (Typ);
+            Set_Has_Inherited_Default_Init_Cond (Typ, False);
 
-         --  pragma Detect_Blocking;
+            --  Chain the pragma on the rep item chain for further processing
 
-         when Pragma_Detect_Blocking =>
-            Ada_2005_Pragma;
-            Check_Arg_Count (0);
-            Check_Valid_Configuration_Pragma;
-            Detect_Blocking := True;
+            Discard := Rep_Item_Too_Late (Typ, N, FOnly => True);
+         end Default_Init_Cond;
 
          ----------------------------------
          -- Default_Scalar_Storage_Order --
@@ -12946,6 +12913,101 @@ package body Sem_Prag is
 
             Default_Pool := Expression (Arg1);
 
+         -------------
+         -- Depends --
+         -------------
+
+         --  pragma Depends (DEPENDENCY_RELATION);
+
+         --  DEPENDENCY_RELATION ::=
+         --    null
+         --  | DEPENDENCY_CLAUSE {, DEPENDENCY_CLAUSE}
+
+         --  DEPENDENCY_CLAUSE ::=
+         --    OUTPUT_LIST =>[+] INPUT_LIST
+         --  | NULL_DEPENDENCY_CLAUSE
+
+         --  NULL_DEPENDENCY_CLAUSE ::= null => INPUT_LIST
+
+         --  OUTPUT_LIST ::= OUTPUT | (OUTPUT {, OUTPUT})
+
+         --  INPUT_LIST ::= null | INPUT | (INPUT {, INPUT})
+
+         --  OUTPUT ::= NAME | FUNCTION_RESULT
+         --  INPUT  ::= NAME
+
+         --  where FUNCTION_RESULT is a function Result attribute_reference
+
+         when Pragma_Depends => Depends : declare
+            Subp_Decl : Node_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_Arg_Count (1);
+            Ensure_Aggregate_Form (Arg1);
+
+            --  Ensure the proper placement of the pragma. Depends must be
+            --  associated with a subprogram declaration or a body that acts
+            --  as a spec.
+
+            Subp_Decl :=
+              Find_Related_Subprogram_Or_Body (N, Do_Checks => True);
+
+            if Nkind (Subp_Decl) = N_Subprogram_Declaration then
+               null;
+
+            --  Body acts as spec
+
+            elsif Nkind (Subp_Decl) = N_Subprogram_Body
+              and then No (Corresponding_Spec (Subp_Decl))
+            then
+               null;
+
+            --  Body stub acts as spec
+
+            elsif Nkind (Subp_Decl) = N_Subprogram_Body_Stub
+              and then No (Corresponding_Spec_Of_Stub (Subp_Decl))
+            then
+               null;
+
+            else
+               Pragma_Misplaced;
+               return;
+            end if;
+
+            --  When the pragma appears on a subprogram body, perform the full
+            --  analysis now.
+
+            if Nkind (Subp_Decl) = N_Subprogram_Body then
+               Analyze_Depends_In_Decl_Part (N);
+
+            --  When Depends applies to a subprogram compilation unit, the
+            --  corresponding pragma is placed after the unit's declaration
+            --  node and needs to be analyzed immediately.
+
+            elsif Nkind (Subp_Decl) = N_Subprogram_Declaration
+              and then Nkind (Parent (Subp_Decl)) = N_Compilation_Unit
+            then
+               Analyze_Depends_In_Decl_Part (N);
+            end if;
+
+            --  Chain the pragma on the contract for further processing
+
+            Add_Contract_Item (N, Defining_Entity (Subp_Decl));
+         end Depends;
+
+         ---------------------
+         -- Detect_Blocking --
+         ---------------------
+
+         --  pragma Detect_Blocking;
+
+         when Pragma_Detect_Blocking =>
+            Ada_2005_Pragma;
+            Check_Arg_Count (0);
+            Check_Valid_Configuration_Pragma;
+            Detect_Blocking := True;
+
          ------------------------------------
          -- Disable_Atomic_Synchronization --
          ------------------------------------
@@ -15208,7 +15270,6 @@ package body Sem_Prag is
          when Pragma_Invariant => Invariant : declare
             Type_Id : Node_Id;
             Typ     : Entity_Id;
-            PDecl   : Node_Id;
             Discard : Boolean;
 
          begin
@@ -15265,10 +15326,8 @@ package body Sem_Prag is
             --  procedure declaration, so that calls to it can be generated
             --  before the body is built (e.g. within an expression function).
 
-            PDecl := Build_Invariant_Procedure_Declaration (Typ);
-
-            Insert_After (N, PDecl);
-            Analyze (PDecl);
+            Insert_After_And_Analyze
+              (N, Build_Invariant_Procedure_Declaration (Typ));
 
             if Class_Present (N) then
                Set_Has_Inheritable_Invariants (Typ);
@@ -24719,6 +24778,7 @@ package body Sem_Prag is
       Pragma_Debug                          => -1,
       Pragma_Debug_Policy                   =>  0,
       Pragma_Detect_Blocking                => -1,
+      Pragma_Default_Initial_Condition      => -1,
       Pragma_Default_Scalar_Storage_Order   =>  0,
       Pragma_Default_Storage_Pool           => -1,
       Pragma_Depends                        => -1,
@@ -25105,34 +25165,35 @@ package body Sem_Prag is
          when
             --  RM defined
 
-            Name_Assert               |
-            Name_Static_Predicate     |
-            Name_Dynamic_Predicate    |
-            Name_Pre                  |
-            Name_uPre                 |
-            Name_Post                 |
-            Name_uPost                |
-            Name_Type_Invariant       |
-            Name_uType_Invariant      |
+            Name_Assert                    |
+            Name_Static_Predicate          |
+            Name_Dynamic_Predicate         |
+            Name_Pre                       |
+            Name_uPre                      |
+            Name_Post                      |
+            Name_uPost                     |
+            Name_Type_Invariant            |
+            Name_uType_Invariant           |
 
             --  Impl defined
 
-            Name_Assert_And_Cut       |
-            Name_Assume               |
-            Name_Contract_Cases       |
-            Name_Debug                |
-            Name_Initial_Condition    |
-            Name_Invariant            |
-            Name_uInvariant           |
-            Name_Loop_Invariant       |
-            Name_Loop_Variant         |
-            Name_Postcondition        |
-            Name_Precondition         |
-            Name_Predicate            |
-            Name_Refined_Post         |
-            Name_Statement_Assertions => return True;
-
-         when others                  => return False;
+            Name_Assert_And_Cut            |
+            Name_Assume                    |
+            Name_Contract_Cases            |
+            Name_Debug                     |
+            Name_Default_Initial_Condition |
+            Name_Initial_Condition         |
+            Name_Invariant                 |
+            Name_uInvariant                |
+            Name_Loop_Invariant            |
+            Name_Loop_Variant              |
+            Name_Postcondition             |
+            Name_Precondition              |
+            Name_Predicate                 |
+            Name_Refined_Post              |
+            Name_Statement_Assertions      => return True;
+
+         when others                       => return False;
       end case;
    end Is_Valid_Assertion_Kind;
 
index 5c1a5a8011ee6e2c2f6015ebb30e43a166a52fc1..e325b9ff14c717575b0e67ef5af1798a5f54cf6d 100644 (file)
@@ -48,6 +48,7 @@ with Sem;      use Sem;
 with Sem_Aux;  use Sem_Aux;
 with Sem_Attr; use Sem_Attr;
 with Sem_Ch8;  use Sem_Ch8;
+with Sem_Ch13; use Sem_Ch13;
 with Sem_Disp; use Sem_Disp;
 with Sem_Eval; use Sem_Eval;
 with Sem_Prag; use Sem_Prag;
@@ -1229,6 +1230,189 @@ package body Sem_Util is
       return Decl;
    end Build_Component_Subtype;
 
+   ----------------------------------
+   -- Build_Default_Init_Cond_Call --
+   ----------------------------------
+
+   function Build_Default_Init_Cond_Call
+     (Loc    : Source_Ptr;
+      Obj_Id : Entity_Id;
+      Typ    : Entity_Id) return Node_Id
+   is
+      Proc_Id    : constant Entity_Id := Default_Init_Cond_Procedure (Typ);
+      Formal_Typ : constant Entity_Id := Etype (First_Formal (Proc_Id));
+
+   begin
+      return
+        Make_Procedure_Call_Statement (Loc,
+          Name                   => New_Occurrence_Of (Proc_Id, Loc),
+          Parameter_Associations => New_List (
+            Make_Type_Conversion (Loc,
+              Subtype_Mark => New_Occurrence_Of (Formal_Typ, Loc),
+              Expression   => New_Occurrence_Of (Obj_Id, Loc))));
+   end Build_Default_Init_Cond_Call;
+
+   --------------------------------------------
+   -- Build_Default_Init_Cond_Procedure_Body --
+   --------------------------------------------
+
+   procedure Build_Default_Init_Cond_Procedure_Body (Typ : Entity_Id) is
+      Param_Id : Entity_Id;
+      --  The entity of the formal parameter of the default initial condition
+      --  procedure.
+
+      procedure Replace_Type_Reference (N : Node_Id);
+      --  Replace a single reference to type Typ with a reference to Param_Id
+
+      ----------------------------
+      -- Replace_Type_Reference --
+      ----------------------------
+
+      procedure Replace_Type_Reference (N : Node_Id) is
+      begin
+         Rewrite (N, New_Occurrence_Of (Param_Id, Sloc (N)));
+      end Replace_Type_Reference;
+
+      procedure Replace_Type_References is
+        new Replace_Type_References_Generic (Replace_Type_Reference);
+
+      --  Local variables
+
+      Loc       : constant Source_Ptr := Sloc (Typ);
+      Prag      : constant Node_Id    :=
+                    Get_Pragma (Typ, Pragma_Default_Initial_Condition);
+      Proc_Id   : constant Entity_Id  := Default_Init_Cond_Procedure (Typ);
+      Spec_Decl : constant Node_Id    := Unit_Declaration_Node (Proc_Id);
+      Body_Decl : Node_Id;
+      Expr      : Node_Id;
+      Stmt      : Node_Id;
+
+   --  Start of processing for Build_Default_Init_Cond_Procedure
+
+   begin
+      --  The procedure should be generated only for types subject to pragma
+      --  Default_Initial_Condition. Types that inherit the pragma do not get
+      --  this specialized procedure.
+
+      pragma Assert (Has_Default_Init_Cond (Typ));
+      pragma Assert (Present (Prag));
+      pragma Assert (Present (Proc_Id));
+
+      --  Nothing to do if the body was already built
+
+      if Present (Corresponding_Body (Spec_Decl)) then
+         return;
+      end if;
+
+      Param_Id := First_Formal (Proc_Id);
+
+      --  The pragma has an argument. Note that the argument is analyzed after
+      --  all references to the current instance of the type are replaced.
+
+      if Present (Pragma_Argument_Associations (Prag)) then
+         Expr := Get_Pragma_Arg (First (Pragma_Argument_Associations (Prag)));
+
+         if Nkind (Expr) = N_Null then
+            Stmt := Make_Null_Statement (Loc);
+
+         --  Preserve the original argument of the pragma by replicating it.
+         --  Replace all references to the current instance of the type with
+         --  references to the formal parameter.
+
+         else
+            Expr := New_Copy_Tree (Expr);
+            Replace_Type_References (Expr, Typ);
+
+            --  Generate:
+            --    pragma Check (Default_Initial_Condition, <Expr>);
+
+            Stmt :=
+              Make_Pragma (Loc,
+                Pragma_Identifier            =>
+                  Make_Identifier (Loc, Name_Check),
+
+                Pragma_Argument_Associations => New_List (
+                  Make_Pragma_Argument_Association (Loc,
+                    Expression =>
+                      Make_Identifier (Loc, Name_Default_Initial_Condition)),
+                  Make_Pragma_Argument_Association (Loc,
+                    Expression => Expr)));
+         end if;
+
+      --  Otherwise the pragma appears without an argument
+
+      else
+         Stmt := Make_Null_Statement (Loc);
+      end if;
+
+      --  Generate:
+      --    procedure <Typ>Default_Init_Cond (I : <Typ>) is
+      --    begin
+      --       <Stmt>;
+      --    end <Typ>Default_Init_Cond;
+
+      Body_Decl :=
+        Make_Subprogram_Body (Loc,
+          Specification              =>
+            Copy_Separate_Tree (Specification (Spec_Decl)),
+          Declarations               => Empty_List,
+          Handled_Statement_Sequence =>
+            Make_Handled_Sequence_Of_Statements (Loc,
+              Statements => New_List (Stmt)));
+
+      --  Link the spec and body of the default initial condition procedure
+      --  to prevent the generation of a duplicate body in case there is an
+      --  attempt to freeze the related type again.
+
+      Set_Corresponding_Body (Spec_Decl, Defining_Entity (Body_Decl));
+      Set_Corresponding_Spec (Body_Decl, Proc_Id);
+
+      Append_Freeze_Action (Typ, Body_Decl);
+   end Build_Default_Init_Cond_Procedure_Body;
+
+   ---------------------------------------------------
+   -- Build_Default_Init_Cond_Procedure_Declaration --
+   ---------------------------------------------------
+
+   procedure Build_Default_Init_Cond_Procedure_Declaration (Typ : Entity_Id) is
+      Loc     : constant Source_Ptr := Sloc (Typ);
+      Prag    : constant Node_Id    :=
+                  Get_Pragma (Typ, Pragma_Default_Initial_Condition);
+      Proc_Id : Entity_Id;
+
+   begin
+      --  The procedure should be generated only for types subject to pragma
+      --  Default_Initial_Condition. Types that inherit the pragma do not get
+      --  this specialized procedure.
+
+      pragma Assert (Has_Default_Init_Cond (Typ));
+      pragma Assert (Present (Prag));
+
+      Proc_Id  :=
+        Make_Defining_Identifier (Loc,
+          Chars => New_External_Name (Chars (Typ), "Default_Init_Cond"));
+
+      --  Associate the default initial condition procedure with the private
+      --  type.
+
+      Set_Ekind (Proc_Id, E_Procedure);
+      Set_Is_Default_Init_Cond_Procedure (Proc_Id);
+      Set_Default_Init_Cond_Procedure (Typ, Proc_Id);
+
+      --  Generate:
+      --    procedure <Typ>Default_Init_Cond (Inn : <Typ>);
+
+      Insert_After_And_Analyze (Prag,
+        Make_Subprogram_Declaration (Loc,
+          Specification =>
+            Make_Procedure_Specification (Loc,
+              Defining_Unit_Name       => Proc_Id,
+              Parameter_Specifications => New_List (
+                Make_Parameter_Specification (Loc,
+                  Defining_Identifier => Make_Temporary (Loc, 'I'),
+                  Parameter_Type      => New_Occurrence_Of (Typ, Loc))))));
+   end Build_Default_Init_Cond_Procedure_Declaration;
+
    ---------------------------
    -- Build_Default_Subtype --
    ---------------------------
@@ -9066,6 +9250,23 @@ package body Sem_Util is
       return Empty;
    end Incomplete_Or_Private_View;
 
+   -----------------------------------------
+   -- Inherit_Default_Init_Cond_Procedure --
+   -----------------------------------------
+
+   procedure Inherit_Default_Init_Cond_Procedure (Typ : Entity_Id) is
+      Par_Typ : constant Entity_Id := Etype (Typ);
+
+   begin
+      --  A derived type inherits the default initial condition procedure of
+      --  its parent type.
+
+      if No (Default_Init_Cond_Procedure (Typ)) then
+         Set_Default_Init_Cond_Procedure
+           (Typ, Default_Init_Cond_Procedure (Par_Typ));
+      end if;
+   end Inherit_Default_Init_Cond_Procedure;
+
    ---------------------------------
    -- Insert_Explicit_Dereference --
    ---------------------------------
index cdb84dc97ca78d6de4319e5520781b8d6987f8e1..025b0cfbbe8101b6b27468a07f78f13aaea7b897 100644 (file)
@@ -211,6 +211,25 @@ package Sem_Util is
    --  Determine whether a selected component has a type that depends on
    --  discriminants, and build actual subtype for it if so.
 
+   function Build_Default_Init_Cond_Call
+     (Loc    : Source_Ptr;
+      Obj_Id : Entity_Id;
+      Typ    : Entity_Id) return Node_Id;
+   --  Build a call to the default initial condition procedure of type Typ with
+   --  Obj_Id as the actual parameter.
+
+   procedure Build_Default_Init_Cond_Procedure_Body (Typ : Entity_Id);
+   --  If private type Typ is subject to pragma Default_Initial_Condition,
+   --  build the body of the procedure which verifies the assumption of the
+   --  pragma at runtime. The generated body is added to the freeze actions
+   --  of the type.
+
+   procedure Build_Default_Init_Cond_Procedure_Declaration (Typ : Entity_Id);
+   --  If private type Typ is subject to pragma Default_Initial_Condition,
+   --  build the declaration of the procedure which verifies the assumption
+   --  of the pragma at runtime. The declaration is inserted after the related
+   --  pragma.
+
    function Build_Default_Subtype
      (T : Entity_Id;
       N : Node_Id) return Entity_Id;
@@ -1065,6 +1084,10 @@ package Sem_Util is
    --  the same type. Note that Typ may not have a partial view to begin with,
    --  in that case the function returns Empty.
 
+   procedure Inherit_Default_Init_Cond_Procedure (Typ : Entity_Id);
+   --  Inherit the default initial condition procedure from the parent type of
+   --  derived type Typ.
+
    procedure Insert_Explicit_Dereference (N : Node_Id);
    --  In a context that requires a composite or subprogram type and where a
    --  prefix is an access type, rewrite the access type node N (which is the
@@ -1596,17 +1619,17 @@ package Sem_Util is
    --  (e.g. target of assignment, or out parameter), and to False if the
    --  modification is only potential (e.g. address of entity taken).
 
+   function Object_Access_Level (Obj : Node_Id) return Uint;
+   --  Return the accessibility level of the view of the object Obj. For
+   --  convenience, qualified expressions applied to object names are also
+   --  allowed as actuals for this function.
+
    function Original_Corresponding_Operation (S : Entity_Id) return Entity_Id;
    --  [Ada 2012: AI05-0125-1]: If S is an inherited dispatching primitive S2,
    --  or overrides an inherited dispatching primitive S2, the original
    --  corresponding operation of S is the original corresponding operation of
    --  S2. Otherwise, it is S itself.
 
-   function Object_Access_Level (Obj : Node_Id) return Uint;
-   --  Return the accessibility level of the view of the object Obj. For
-   --  convenience, qualified expressions applied to object names are also
-   --  allowed as actuals for this function.
-
    function Original_Aspect_Name (N : Node_Id) return Name_Id;
    --  N is a pragma node or aspect specification node. This function returns
    --  the name of the pragma or aspect in original source form, taking into
index 584e58c51c0ea1f9f9166cabec71fb5f9155a61e..c1b62b29e3a36aa0cbe4c19b2ac4ca9844d2e221 100644 (file)
@@ -479,6 +479,7 @@ package Snames is
    --  pragma.
 
    Name_Debug                          : constant Name_Id := N + $; -- GNAT
+   Name_Default_Initial_Condition      : constant Name_Id := N + $; -- GNAT
    Name_Depends                        : constant Name_Id := N + $; -- GNAT
    Name_Effective_Reads                : constant Name_Id := N + $; -- GNAT
    Name_Effective_Writes               : constant Name_Id := N + $; -- GNAT
@@ -1810,6 +1811,7 @@ package Snames is
       Pragma_CPP_Virtual,
       Pragma_CPP_Vtable,
       Pragma_Debug,
+      Pragma_Default_Initial_Condition,
       Pragma_Depends,
       Pragma_Effective_Reads,
       Pragma_Effective_Writes,