]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gnat_rm.texi: Document pragma Unevaluated_Use_Of_Old.
authorRobert Dewar <dewar@adacore.com>
Tue, 29 Jul 2014 13:00:08 +0000 (13:00 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 29 Jul 2014 13:00:08 +0000 (15:00 +0200)
2014-07-29  Robert Dewar  <dewar@adacore.com>

* gnat_rm.texi: Document pragma Unevaluated_Use_Of_Old.
* opt.adb: Handle Uneval_Old.
* opt.ads (Uneval_Old, Uneval_Old_Config): New variables.
* par-prag.adb: Add dummy entry for pragma Unevaluated_Use_Of_Old.
* sem.ads (Save_Uneval_Old): New field in Scope_Stack_Entry.
* sem_attr.adb (Uneval_Old_Msg): New procedure.
* sem_ch8.adb (Push_Scope): Save Uneval_Old.
(Pop_Scope): Restore Uneval_Old.
* sem_prag.adb (Analyze_Pragma, case Unevaluated_Use_Of_Old):
Implemented.
* snames.ads-tmpl: Add entries for pragma Unevaluated_Use_Of_Old
Add entries for Name_Warn, Name_Allow.

From-SVN: r213160

19 files changed:
gcc/ada/ChangeLog
gcc/ada/checks.adb
gcc/ada/einfo.adb
gcc/ada/einfo.ads
gcc/ada/errout.ads
gcc/ada/exp_ch3.adb
gcc/ada/gnat_rm.texi
gcc/ada/opt.adb
gcc/ada/opt.ads
gcc/ada/par-prag.adb
gcc/ada/sem.ads
gcc/ada/sem_attr.adb
gcc/ada/sem_ch3.adb
gcc/ada/sem_ch4.adb
gcc/ada/sem_ch7.adb
gcc/ada/sem_ch8.adb
gcc/ada/sem_ch9.adb
gcc/ada/sem_prag.adb
gcc/ada/snames.ads-tmpl

index 40e3d1849e2c4057c8af7036a43da5d0d410038e..8b3e285f329a07e669e90071cd994160f1791e6d 100644 (file)
@@ -1,3 +1,18 @@
+2014-07-29  Robert Dewar  <dewar@adacore.com>
+
+       * gnat_rm.texi: Document pragma Unevaluated_Use_Of_Old.
+       * opt.adb: Handle Uneval_Old.
+       * opt.ads (Uneval_Old, Uneval_Old_Config): New variables.
+       * par-prag.adb: Add dummy entry for pragma Unevaluated_Use_Of_Old.
+       * sem.ads (Save_Uneval_Old): New field in Scope_Stack_Entry.
+       * sem_attr.adb (Uneval_Old_Msg): New procedure.
+       * sem_ch8.adb (Push_Scope): Save Uneval_Old.
+       (Pop_Scope): Restore Uneval_Old.
+       * sem_prag.adb (Analyze_Pragma, case Unevaluated_Use_Of_Old):
+       Implemented.
+       * snames.ads-tmpl: Add entries for pragma Unevaluated_Use_Of_Old
+       Add entries for Name_Warn, Name_Allow.
+
 2014-07-29  Robert Dewar  <dewar@adacore.com>
 
        * sem_aggr.adb (Resolve_Array_Aggregate): Change Is_Static_Range
index d875cb5a6d85c5f35af406d683fd5cc237799849..b0538d8fd689f2416e1f16500893453447ebe3a7 100644 (file)
@@ -5973,13 +5973,18 @@ package body Checks is
       --  cases are like this. Notably conversions can involve two types.
 
       if Source_Base_Type = Target_Base_Type then
+
+         --  Insert the explicit range check. Note that we suppress checks for
+         --  this code, since we don't want a recursive range check popping up.
+
          Insert_Action (N,
            Make_Raise_Constraint_Error (Loc,
              Condition =>
                Make_Not_In (Loc,
                  Left_Opnd  => Duplicate_Subexpr (N),
                  Right_Opnd => New_Occurrence_Of (Target_Type, Loc)),
-             Reason => Reason));
+             Reason => Reason),
+           Suppress => All_Checks);
 
       --  Next test for the case where the target type is within the bounds
       --  of the base type of the source type, since in this case we can
@@ -5999,6 +6004,10 @@ package body Checks is
       --  itself does not require a check.
 
       elsif In_Subrange_Of (Target_Type, Source_Base_Type) then
+
+         --  Insert the explicit range check. Note that we suppress checks for
+         --  this code, since we don't want a recursive range check popping up.
+
          Insert_Action (N,
            Make_Raise_Constraint_Error (Loc,
              Condition =>
@@ -6020,7 +6029,8 @@ package body Checks is
                            Prefix =>
                              New_Occurrence_Of (Target_Type, Loc),
                            Attribute_Name => Name_Last)))),
-             Reason => Reason));
+             Reason => Reason),
+           Suppress => All_Checks);
 
       --  Note that at this stage we now that the Target_Base_Type is not in
       --  the range of the Source_Base_Type (since even the Target_Type itself
@@ -6041,6 +6051,9 @@ package body Checks is
 
          --  Then the conversion itself is replaced by an occurrence of Tnn
 
+         --  Insert the explicit range check. Note that we suppress checks for
+         --  this code, since we don't want a recursive range check popping up.
+
          declare
             Tnn : constant Entity_Id := Make_Temporary (Loc, 'T', N);
 
@@ -6062,7 +6075,8 @@ package body Checks is
                     Left_Opnd  => New_Occurrence_Of (Tnn, Loc),
                     Right_Opnd => New_Occurrence_Of (Target_Type, Loc)),
 
-                Reason => Reason)));
+                Reason => Reason)),
+              Suppress => All_Checks);
 
             Rewrite (N, New_Occurrence_Of (Tnn, Loc));
 
index 634d92acaeab3cbd172928ef9d2b31a10dd2fa5b..8c967d3482f670a4094c7f6f0d58c118fafd3c22 100644 (file)
@@ -562,11 +562,12 @@ package body Einfo is
    --    Has_Static_Predicate            Flag269
    --    Stores_Attribute_Old_Prefix     Flag270
 
+   --    (Has_Protected)                 Flag271
+
    --    (unused)                        Flag1
    --    (unused)                        Flag2
    --    (unused)                        Flag3
 
-   --    (unused)                        Flag271
    --    (unused)                        Flag272
    --    (unused)                        Flag273
    --    (unused)                        Flag274
@@ -1643,6 +1644,11 @@ package body Einfo is
       return Flag155 (Id);
    end Has_Private_Declaration;
 
+   function Has_Protected (Id : E) return B is
+   begin
+      return Flag271 (Id);
+   end Has_Protected;
+
    function Has_Qualified_Name (Id : E) return B is
    begin
       return Flag161 (Id);
@@ -4372,6 +4378,11 @@ package body Einfo is
       Set_Flag155 (Id, V);
    end Set_Has_Private_Declaration;
 
+   procedure Set_Has_Protected (Id : E; V : B := True) is
+   begin
+      Set_Flag271 (Id, V);
+   end Set_Has_Protected;
+
    procedure Set_Has_Qualified_Name (Id : E; V : B := True) is
    begin
       Set_Flag161 (Id, V);
@@ -8252,6 +8263,7 @@ package body Einfo is
       W ("Has_Primitive_Operations",        Flag120 (Id));
       W ("Has_Private_Ancestor",            Flag151 (Id));
       W ("Has_Private_Declaration",         Flag155 (Id));
+      W ("Has_Protected",                   Flag271 (Id));
       W ("Has_Qualified_Name",              Flag161 (Id));
       W ("Has_RACW",                        Flag214 (Id));
       W ("Has_Record_Rep_Clause",           Flag65  (Id));
index 135de489abb31b8181469887d87d48e198b31809..141ad09e311e2b4bae5ac0df4a5f8560254f45f8 100644 (file)
@@ -1808,6 +1808,14 @@ package Einfo is
 --       indicate if a full type declaration is a completion. Used for semantic
 --       checks in E.4(18) and elsewhere.
 
+--    Has_Protected (Flag271) [base type only]
+--       Defined in all type entities. Set on protected types themselves, and
+--       also (recursively) on any composite type which has a component for
+--       which Has_Protected is set. The meaning is that an allocator for
+--       or declaration of such an object must create the required protected
+--       objects. Note: the flag is not set on access types, even if they
+--       designate an object that Has_Protected.
+
 --    Has_Qualified_Name (Flag161)
 --       Defined in all entities. Set if the name in the Chars field has
 --       been replaced by its qualified name, as used for debug output. See
@@ -5203,6 +5211,7 @@ package Einfo is
    --    Has_Pragma_Unreferenced_Objects     (Flag212)
    --    Has_Predicates                      (Flag250)
    --    Has_Primitive_Operations            (Flag120)  (base type only)
+   --    Has_Protected                       (Flag271)  (base type only)
    --    Has_Size_Clause                     (Flag29)
    --    Has_Specified_Layout                (Flag100)  (base type only)
    --    Has_Specified_Stream_Input          (Flag190)
@@ -6551,6 +6560,7 @@ package Einfo is
    function Has_Primitive_Operations            (Id : E) return B;
    function Has_Private_Ancestor                (Id : E) return B;
    function Has_Private_Declaration             (Id : E) return B;
+   function Has_Protected                       (Id : E) return B;
    function Has_Qualified_Name                  (Id : E) return B;
    function Has_RACW                            (Id : E) return B;
    function Has_Record_Rep_Clause               (Id : E) return B;
@@ -7179,6 +7189,7 @@ package Einfo is
    procedure Set_Has_Primitive_Operations        (Id : E; V : B := True);
    procedure Set_Has_Private_Ancestor            (Id : E; V : B := True);
    procedure Set_Has_Private_Declaration         (Id : E; V : B := True);
+   procedure Set_Has_Protected                   (Id : E; V : B := True);
    procedure Set_Has_Qualified_Name              (Id : E; V : B := True);
    procedure Set_Has_RACW                        (Id : E; V : B := True);
    procedure Set_Has_Record_Rep_Clause           (Id : E; V : B := True);
@@ -7920,6 +7931,7 @@ package Einfo is
    pragma Inline (Has_Primitive_Operations);
    pragma Inline (Has_Private_Ancestor);
    pragma Inline (Has_Private_Declaration);
+   pragma Inline (Has_Protected);
    pragma Inline (Has_Qualified_Name);
    pragma Inline (Has_RACW);
    pragma Inline (Has_Record_Rep_Clause);
@@ -8395,6 +8407,7 @@ package Einfo is
    pragma Inline (Set_Has_Primitive_Operations);
    pragma Inline (Set_Has_Private_Ancestor);
    pragma Inline (Set_Has_Private_Declaration);
+   pragma Inline (Set_Has_Protected);
    pragma Inline (Set_Has_Qualified_Name);
    pragma Inline (Set_Has_RACW);
    pragma Inline (Set_Has_Record_Rep_Clause);
index 303c21494ebd2160432db768e4a435809fa2982e..19931e83236010b0c344a027ddb4dded623b56a5 100644 (file)
@@ -836,7 +836,7 @@ package Errout is
    procedure Remove_Warning_Messages (N : Node_Id);
    --  Remove any warning messages corresponding to the Sloc of N or any
    --  of its descendent nodes. No effect if no such warnings. Note that
-   --  style messages (identified by the fact that they start with "(style)"
+   --  style messages (identified by the fact that they start with "(style)")
    --  are not removed by this call. Basically the idea behind this procedure
    --  is to remove warnings about execution conditions from known dead code.
 
index 38327e904e42cdf2be4c04bc1c61f6815c817849..bd5aef94245a02e66ad01e7366e108bb38e0471a 100644 (file)
@@ -6160,12 +6160,15 @@ package body Exp_Ch3 is
          --  If the component contains tasks, so does the array type. This may
          --  not be indicated in the array type because the component may have
          --  been a private type at the point of definition. Same if component
-         --  type is controlled.
+         --  type is controlled or contains protected objects.
 
-         Set_Has_Task (Base, Has_Task (Comp_Typ));
-         Set_Has_Controlled_Component (Base,
-           Has_Controlled_Component (Comp_Typ)
-             or else Is_Controlled (Comp_Typ));
+         Set_Has_Task       (Base, Has_Task      (Comp_Typ));
+         Set_Has_Protected  (Base, Has_Protected (Comp_Typ));
+         Set_Has_Controlled_Component
+                            (Base, Has_Controlled_Component
+                                                 (Comp_Typ)
+                                     or else
+                                   Is_Controlled (Comp_Typ));
 
          if No (Init_Proc (Base)) then
 
@@ -6719,9 +6722,9 @@ package body Exp_Ch3 is
          Check_Stream_Attributes (Def_Id);
       end if;
 
-      --  Update task and controlled component flags, because some of the
-      --  component types may have been private at the point of the record
-      --  declaration. Detect anonymous access-to-controlled components.
+      --  Update task, protected, and controlled component flags, because some
+      --  of the component types may have been private at the point of the
+      --  record declaration. Detect anonymous access-to-controlled components.
 
       Has_AACC := False;
 
@@ -6731,20 +6734,26 @@ package body Exp_Ch3 is
 
          if Has_Task (Comp_Typ) then
             Set_Has_Task (Def_Id);
+         end if;
+
+         if Has_Protected (Comp_Typ) then
+            Set_Has_Protected (Def_Id);
+         end if;
 
          --  Do not set Has_Controlled_Component on a class-wide equivalent
          --  type. See Make_CW_Equivalent_Type.
 
-         elsif not Is_Class_Wide_Equivalent_Type (Def_Id)
+         if not Is_Class_Wide_Equivalent_Type (Def_Id)
            and then (Has_Controlled_Component (Comp_Typ)
                       or else (Chars (Comp) /= Name_uParent
                                 and then Is_Controlled (Comp_Typ)))
          then
             Set_Has_Controlled_Component (Def_Id);
+         end if;
 
          --  Non-self-referential anonymous access-to-controlled component
 
-         elsif Ekind (Comp_Typ) = E_Anonymous_Access_Type
+         if Ekind (Comp_Typ) = E_Anonymous_Access_Type
            and then Needs_Finalization (Designated_Type (Comp_Typ))
            and then Designated_Type (Comp_Typ) /= Def_Id
          then
index b1bcfb75c7dceda7e5e8ffa16d4d9911f2bcb376..eb762b698986d67822d335517c6434c7710b14fc 100644 (file)
@@ -270,6 +270,7 @@ Implementation Defined Pragmas
 * Pragma Type_Invariant::
 * Pragma Type_Invariant_Class::
 * Pragma Unchecked_Union::
+* Pragma Unevaluated_Use_Of_Old::
 * Pragma Unimplemented_Unit::
 * Pragma Universal_Aliasing ::
 * Pragma Universal_Data::
@@ -1119,6 +1120,7 @@ consideration, the use of these pragmas should be minimized.
 * Pragma Type_Invariant::
 * Pragma Type_Invariant_Class::
 * Pragma Unchecked_Union::
+* Pragma Unevaluated_Use_Of_Old::
 * Pragma Unimplemented_Unit::
 * Pragma Universal_Aliasing ::
 * Pragma Universal_Data::
@@ -7242,6 +7244,59 @@ pragma, making it language defined, and GNAT fully implements this extended
 version in all language modes (Ada 83, Ada 95, and Ada 2005). For full
 details, consult the Ada 2012 Reference Manual, section B.3.3.
 
+@node Pragma Unevaluated_Use_Of_Old
+@unnumberedsec Pragma Unevaluated_Use_Of_Old
+@cindex Attribute Old
+@cindex Attribute Loop_Entry
+@cindex Unevaluated_Use_Of_Old
+@findex Unevaluated_Use_Of_Old
+@noindent
+Syntax:
+
+@smallexample @c ada
+pragma Unevaluated_Use_Of_Old (Error | Warn | Allow);
+@end smallexample
+
+@noindent
+This pragma controls the processing of attributes Old and Loop_Entry.
+If either of these attributes is used in a potentially unevaluated
+expression  (e.g. the then or else parts of an if expression), then
+normally this usage is considered illegal if the prefix of the attribute
+is other than an entity name. The language requires this
+behavior for Old, and GNAT copies the same rule for Loop_Entry.
+
+The reason for this rule is that otherwise, we can have a situation
+where we save the Old value, and this results in an exception, even
+though we might not evaluate the attribute. Consider this example:
+
+@smallexample @c ada
+package UnevalOld is
+   K : Character;
+   procedure U (A : String; C : Boolean)  -- ERROR
+     with Post => (if C then A(1)'Old = K else True);
+end;
+@end smallexample
+
+@noindent
+If procedure U is called with a string with a lower bound of 2, and
+C false, then an exception would be raised trying to evaluate A(1)
+on entry even though the value would not be actually used.
+
+Although the rule guarantees against this possibility, it is sometimes
+too restrictive. For example if we know that the string has a lower
+bound of 1, then we will never raise an exception.
+The pragma @code{Unevaluated_Use_Of_Old} can be
+used to modify this behavior. If the argument is @code{Error} then an
+error is given (this is the default RM behavior). If the argument is
+@code{Warn} then the usage is allowed as legal but with a warning
+that an exception might be raised. If the argument is @code{Allow}
+then the usage is allowed as legal without generating a warning.
+
+This pragma may appear as a configuration pragma, or in a declarative
+part or package specification. In the latter case it applies to
+uses up to the end of the corresponding statement sequence or
+sequence of package declarations.
+
 @node Pragma Unimplemented_Unit
 @unnumberedsec Pragma Unimplemented_Unit
 @findex Unimplemented_Unit
index c8edad417cee67783cd1e60ee3a14e50d77c22b7..68944c7cc3cf2a313b60c51dd83853178f930177 100644 (file)
@@ -65,6 +65,7 @@ package body Opt is
       Short_Descriptors_Config              := Short_Descriptors;
       SPARK_Mode_Config                     := SPARK_Mode;
       SPARK_Mode_Pragma_Config              := SPARK_Mode_Pragma;
+      Uneval_Old_Config                     := Uneval_Old;
       Use_VADS_Size_Config                  := Use_VADS_Size;
       Warnings_As_Errors_Count_Config       := Warnings_As_Errors_Count;
 
@@ -103,6 +104,7 @@ package body Opt is
       Short_Descriptors              := Save.Short_Descriptors;
       SPARK_Mode                     := Save.SPARK_Mode;
       SPARK_Mode_Pragma              := Save.SPARK_Mode_Pragma;
+      Uneval_Old                     := Save.Uneval_Old;
       Use_VADS_Size                  := Save.Use_VADS_Size;
       Warnings_As_Errors_Count       := Save.Warnings_As_Errors_Count;
 
@@ -142,6 +144,7 @@ package body Opt is
       Save.Short_Descriptors              := Short_Descriptors;
       Save.SPARK_Mode                     := SPARK_Mode;
       Save.SPARK_Mode_Pragma              := SPARK_Mode_Pragma;
+      Save.Uneval_Old                     := Uneval_Old;
       Save.Use_VADS_Size                  := Use_VADS_Size;
       Save.Warnings_As_Errors_Count       := Warnings_As_Errors_Count;
    end Save_Opt_Config_Switches;
@@ -171,6 +174,7 @@ package body Opt is
          External_Name_Imp_Casing    := Lowercase;
          Optimize_Alignment          := 'O';
          Persistent_BSS_Mode         := False;
+         Uneval_Old                  := 'E';
          Use_VADS_Size               := False;
          Optimize_Alignment_Local    := True;
 
@@ -217,6 +221,7 @@ package body Opt is
          Persistent_BSS_Mode         := Persistent_BSS_Mode_Config;
          SPARK_Mode                  := SPARK_Mode_Config;
          SPARK_Mode_Pragma           := SPARK_Mode_Pragma_Config;
+         Uneval_Old                  := Uneval_Old_Config;
          Use_VADS_Size               := Use_VADS_Size_Config;
          Warnings_As_Errors_Count    := Warnings_As_Errors_Count_Config;
 
index 5973776946827c61078c3b2cc1ae95c664889d69..4f882105364ccf303f464826785f0313d7c959a4 100644 (file)
@@ -1487,6 +1487,11 @@ package Opt is
    --  file for the compiler. Indicates that while preprocessing sources,
    --  symbols that are not defined have the value FALSE.
 
+   Uneval_Old : Character := 'E';
+   --  GNAT
+   --  Set to 'E'/'W'/'A' for use of Error/Warn/Allow in a valid pragma
+   --  Unevaluated_Use_Of_Old.
+
    Unique_Error_Tag : Boolean := Tag_Errors;
    --  GNAT
    --  Indicates if error messages are to be prefixed by the string error:
@@ -1952,6 +1957,10 @@ package Opt is
    --  If a SPARK_Mode pragma appeared in the configuration pragmas (setting
    --  SPARK_Mode_Config appropriately), then this points to the N_Pragma node.
 
+   Uneval_Old_Config : Character;
+   --  GNAT
+   --  The setting of Uneval_Old from configuration pragmas
+
    Use_VADS_Size_Config : Boolean;
    --  GNAT
    --  This is the value of the configuration switch that controls the use of
@@ -2122,6 +2131,7 @@ private
       Short_Descriptors              : Boolean;
       SPARK_Mode                     : SPARK_Mode_Type;
       SPARK_Mode_Pragma              : Node_Id;
+      Uneval_Old                     : Character;
       Use_VADS_Size                  : Boolean;
       Warnings_As_Errors_Count       : Natural;
    end record;
index a7509af8c201b8f6cfb49a3eb72255d590e56b68..f755611c1f60034f8d95058946aefa40055701ca 100644 (file)
@@ -1337,6 +1337,7 @@ begin
            Pragma_Type_Invariant                 |
            Pragma_Type_Invariant_Class           |
            Pragma_Unchecked_Union                |
+           Pragma_Unevaluated_Use_Of_Old         |
            Pragma_Unimplemented_Unit             |
            Pragma_Universal_Aliasing             |
            Pragma_Universal_Data                 |
index 667fbc1dc8537c83996d38f61d3720c433947104..5a6ebcda8b599238d3a0094c6c984993669e7b5e 100644 (file)
@@ -486,6 +486,9 @@ package Sem is
       Save_SPARK_Mode_Pragma : Node_Id;
       --  Setting of SPARK_Mode_Pragma on entry to restore on exit
 
+      Save_Uneval_Old : Character;
+      --  Setting of Uneval_Old on entry to restore on exit
+
       Is_Transient : Boolean;
       --  Marks transient scopes (see Exp_Ch7 body for details)
 
index 8502c421b1eb9d7656efd5c082918c3ec0c65b51..1619d6f0ece1f8304e6766b1966d4ca9ef54ab82 100644 (file)
@@ -409,6 +409,12 @@ package body Sem_Attr is
       --  node is rewritten with an integer literal of the given value which
       --  is marked as static.
 
+      procedure Uneval_Old_Msg;
+      --  Called when Loop_Entry or Old is used in a potentially unevaluated
+      --  expression. Generates appropriate message or warning depending on
+      --  the setting of Opt.Uneval_Old. The caller has put the Name_Id of
+      --  the attribute in Error_Msg_Name_1 prior to the call.
+
       procedure Unexpected_Argument (En : Node_Id);
       --  Signal unexpected attribute argument (En is the argument)
 
@@ -2264,6 +2270,31 @@ package body Sem_Attr is
          Set_Is_Static_Expression (N, True);
       end Standard_Attribute;
 
+      --------------------
+      -- Uneval_Old_Msg --
+      --------------------
+
+      procedure Uneval_Old_Msg is
+      begin
+         case Uneval_Old is
+            when 'E' =>
+               Error_Attr_P
+                 ("prefix of attribute % that is potentially "
+                  & "unevaluated must denote an entity");
+
+            when 'W' =>
+               Error_Attr_P
+                 ("??prefix of attribute % appears in potentially "
+                  & "unevaluated context, exception may be raised");
+
+            when 'A' =>
+               null;
+
+            when others =>
+               raise Program_Error;
+         end case;
+      end Uneval_Old_Msg;
+
       -------------------------
       -- Unexpected Argument --
       -------------------------
@@ -4108,9 +4139,7 @@ package body Sem_Attr is
                & "outer loop must denote an entity");
 
          elsif Is_Potentially_Unevaluated (P) then
-            Error_Attr_P
-              ("prefix of attribute % that is potentially "
-               & "unevaluated must denote an entity");
+            Uneval_Old_Msg;
          end if;
 
          --  Finally, if the Loop_Entry attribute appears within a pragma
@@ -4751,9 +4780,7 @@ package body Sem_Attr is
            and then Is_Potentially_Unevaluated (N)
            and then not Is_Entity_Name (P)
          then
-            Error_Attr_P
-              ("prefix of attribute % that is potentially unevaluated must "
-               & "denote an entity");
+            Uneval_Old_Msg;
          end if;
 
          --  The attribute appears within a pre/postcondition, but refers to
index e247e662f4ff824d73f2108a892a291e015c92f6..9eb1618a09992513e25c23c8222f7de0e5218ef8 100644 (file)
@@ -1374,10 +1374,12 @@ package body Sem_Ch3 is
 
       --  Note that Has_Task is always false, since the access type itself
       --  is not a task type. See Einfo for more description on this point.
-      --  Exactly the same consideration applies to Has_Controlled_Component.
+      --  Exactly the same consideration applies to Has_Controlled_Component
+      --  and to Has_Protected.
 
-      Set_Has_Task (T, False);
+      Set_Has_Task                 (T, False);
       Set_Has_Controlled_Component (T, False);
+      Set_Has_Protected            (T, False);
 
       --  Initialize field Finalization_Master explicitly to Empty, to avoid
       --  problems where an incomplete view of this entity has been previously
@@ -4177,6 +4179,7 @@ package body Sem_Ch3 is
 
       Set_Etype            (T,            Parent_Base);
       Set_Has_Task         (T, Has_Task  (Parent_Base));
+      Set_Has_Protected    (T, Has_Task  (Parent_Base));
 
       Set_Convention       (T, Convention     (Parent_Type));
       Set_First_Rep_Item   (T, First_Rep_Item (Parent_Type));
@@ -5167,6 +5170,7 @@ package body Sem_Ch3 is
          Set_First_Index       (Implicit_Base, First_Index (T));
          Set_Component_Type    (Implicit_Base, Element_Type);
          Set_Has_Task          (Implicit_Base, Has_Task (Element_Type));
+         Set_Has_Protected     (Implicit_Base, Has_Protected (Element_Type));
          Set_Component_Size    (Implicit_Base, Uint_0);
          Set_Packed_Array_Impl_Type (Implicit_Base, Empty);
          Set_Has_Controlled_Component
@@ -5190,6 +5194,7 @@ package body Sem_Ch3 is
          Set_First_Index              (T, First (Subtype_Marks (Def)));
          Set_Has_Delayed_Freeze       (T, True);
          Set_Has_Task                 (T, Has_Task      (Element_Type));
+         Set_Has_Protected            (T, Has_Protected (Element_Type));
          Set_Has_Controlled_Component (T, Has_Controlled_Component
                                                         (Element_Type)
                                             or else
@@ -8451,9 +8456,10 @@ package body Sem_Ch3 is
 
       Set_Scope          (Derived_Type, Current_Scope);
 
-      Set_Ekind          (Derived_Type, Ekind    (Parent_Base));
-      Set_Etype          (Derived_Type,           Parent_Base);
-      Set_Has_Task       (Derived_Type, Has_Task (Parent_Base));
+      Set_Etype          (Derived_Type,                Parent_Base);
+      Set_Ekind          (Derived_Type, Ekind         (Parent_Base));
+      Set_Has_Task       (Derived_Type, Has_Task      (Parent_Base));
+      Set_Has_Protected  (Derived_Type, Has_Protected (Parent_Base));
 
       Set_Size_Info      (Derived_Type,                 Parent_Type);
       Set_RM_Size        (Derived_Type, RM_Size        (Parent_Type));
@@ -12755,6 +12761,7 @@ package body Sem_Ch3 is
       Set_Component_Size           (T1, Component_Size           (T2));
       Set_Has_Controlled_Component (T1, Has_Controlled_Component (T2));
       Set_Has_Non_Standard_Rep     (T1, Has_Non_Standard_Rep     (T2));
+      Set_Has_Protected            (T1, Has_Protected            (T2));
       Set_Has_Task                 (T1, Has_Task                 (T2));
       Set_Is_Packed                (T1, Is_Packed                (T2));
       Set_Has_Aliased_Components   (T1, Has_Aliased_Components   (T2));
@@ -18762,7 +18769,9 @@ package body Sem_Ch3 is
                Set_Class_Wide_Type
                  (Base_Type (Full_T), Class_Wide_Type (Priv_T));
 
-               Set_Has_Task (Class_Wide_Type (Priv_T), Has_Task (Full_T));
+               Set_Has_Task (Class_Wide_Type (Priv_T), Has_Task      (Full_T));
+               Set_Has_Protected
+                            (Class_Wide_Type (Priv_T), Has_Protected (Full_T));
             end if;
          end;
       end if;
@@ -20309,6 +20318,10 @@ package body Sem_Ch3 is
             Set_Has_Task (T);
          end if;
 
+         if Has_Protected (Etype (Component)) then
+            Set_Has_Protected (T);
+         end if;
+
          if Ekind (Component) /= E_Component then
             null;
 
index 81d3841c86a2683923957f715ca8813c7a84f010..7f9f086ad8ce71f3a5f359af6fd4a50eb859e203 100644 (file)
@@ -644,7 +644,7 @@ package body Sem_Ch4 is
             --  a similar test should be applied to an allocator with a
             --  qualified expression ???
 
-            if Is_Protected_Type (Type_Id) then
+            if Has_Protected (Type_Id) then
                Check_Restriction (No_Protected_Type_Allocators, N);
             end if;
 
@@ -737,11 +737,8 @@ package body Sem_Ch4 is
 
       --  Check that an allocator of a nested access type doesn't create a
       --  protected object when restriction No_Local_Protected_Objects applies.
-      --  We don't have an equivalent to Has_Task for protected types, so only
-      --  cases where the designated type itself is a protected type are
-      --  currently checked. ???
 
-      if Is_Protected_Type (Designated_Type (Acc_Type))
+      if Has_Protected (Designated_Type (Acc_Type))
         and then not Is_Library_Level_Entity (Acc_Type)
       then
          Check_Restriction (No_Local_Protected_Objects, N);
index 099bbd74d10addc82e6e4e1c47acffdf2513d8b9..418e2166b4f16e06b4bc3c5d61499623b8439a59 100644 (file)
@@ -2369,11 +2369,14 @@ package body Sem_Ch7 is
 
          if Priv_Is_Base_Type then
             Set_Is_Controlled (Priv, Is_Controlled (Base_Type (Full)));
-            Set_Finalize_Storage_Only (Priv, Finalize_Storage_Only
-                                                           (Base_Type (Full)));
-            Set_Has_Task (Priv, Has_Task (Base_Type (Full)));
-            Set_Has_Controlled_Component (Priv, Has_Controlled_Component
-                                                           (Base_Type (Full)));
+            Set_Finalize_Storage_Only
+                              (Priv, Finalize_Storage_Only
+                                                   (Base_Type (Full)));
+            Set_Has_Task      (Priv, Has_Task      (Base_Type (Full)));
+            Set_Has_Protected (Priv, Has_Protected (Base_Type (Full)));
+            Set_Has_Controlled_Component
+                              (Priv, Has_Controlled_Component
+                                                   (Base_Type (Full)));
          end if;
 
          Set_Freeze_Node (Priv, Freeze_Node (Full));
index e085cd203c0186c2060e6ab78cb429a05a4b1646..f2f03f0e39300e6d65d988b43e664df631491ebd 100644 (file)
@@ -7533,6 +7533,7 @@ package body Sem_Ch8 is
       Default_Pool             := SST.Save_Default_Storage_Pool;
       SPARK_Mode               := SST.Save_SPARK_Mode;
       SPARK_Mode_Pragma        := SST.Save_SPARK_Mode_Pragma;
+      Uneval_Old               := SST.Save_Uneval_Old;
 
       if Debug_Flag_W then
          Write_Str ("<-- exiting scope: ");
@@ -7605,6 +7606,7 @@ package body Sem_Ch8 is
          SST.Save_Default_Storage_Pool     := Default_Pool;
          SST.Save_SPARK_Mode               := SPARK_Mode;
          SST.Save_SPARK_Mode_Pragma        := SPARK_Mode_Pragma;
+         SST.Save_Uneval_Old               := Uneval_Old;
 
          if Scope_Stack.Last > Scope_Stack.First then
             SST.Component_Alignment_Default := Scope_Stack.Table
index 00f9abe5897624db680e5d0ab002c8a09b5ed64f..82fa38a99178f4cf8ffebe2bcf852eb81c4500f3 100644 (file)
@@ -1912,6 +1912,11 @@ package body Sem_Ch9 is
            or else Has_Task (Etype (E))
          then
             Set_Has_Task (Current_Scope);
+
+         elsif Is_Protected_Type (Etype (E))
+           or else Has_Protected (Etype (E))
+         then
+            Set_Has_Protected (Current_Scope);
          end if;
 
          Next_Entity (E);
@@ -1958,6 +1963,7 @@ package body Sem_Ch9 is
 
       Set_Ekind              (T, E_Protected_Type);
       Set_Is_First_Subtype   (T, True);
+      Set_Has_Protected      (T, True);
       Init_Size_Align        (T);
       Set_Etype              (T, T);
       Set_Has_Delayed_Freeze (T, True);
index b38d9a3fafc4431cd5a76c669cacc377f4deab96..136a664ffe9ca0e9107847daf470401038839e5c 100644 (file)
@@ -21182,6 +21182,30 @@ package body Sem_Prag is
             Ada_2005_Pragma;
             Process_Suppress_Unsuppress (False);
 
+         ----------------------------
+         -- Unevaluated_Use_Of_Old --
+         ----------------------------
+
+         --  pragma Unevaluated_Use_Of_Old (Error | Warn | Allow);
+
+         when Pragma_Unevaluated_Use_Of_Old =>
+            GNAT_Pragma;
+            Check_Arg_Count (1);
+            Check_No_Identifiers;
+            Check_Arg_Is_One_Of (Arg1, Name_Error, Name_Warn, Name_Allow);
+
+            --  Suppress/Unsuppress can appear as a configuration pragma, or in
+            --  a declarative part or a package spec.
+
+            if not Is_Configuration_Pragma then
+               Check_Is_In_Decl_Part_Or_Package_Spec;
+            end if;
+
+            --  Store proper setting of Uneval_Old
+
+            Get_Name_String (Chars (Get_Pragma_Arg (Arg1)));
+            Uneval_Old := Fold_Upper (Name_Buffer (1));
+
          -------------------
          -- Use_VADS_Size --
          -------------------
@@ -25442,6 +25466,7 @@ package body Sem_Prag is
       Pragma_Unreferenced_Objects           => -1,
       Pragma_Unreserve_All_Interrupts       => -1,
       Pragma_Unsuppress                     =>  0,
+      Pragma_Unevaluated_Use_Of_Old         =>  0,
       Pragma_Use_VADS_Size                  => -1,
       Pragma_Validity_Checks                => -1,
       Pragma_Volatile                       =>  0,
index f4b5faca91ac69bb08f71037618e9c7a827e1577..8315566a155aada9dae2b802c2bc9e9b2c101257 100644 (file)
@@ -442,6 +442,7 @@ package Snames is
    Name_Suppress                       : constant Name_Id := N + $;
    Name_Suppress_Exception_Locations   : constant Name_Id := N + $; -- GNAT
    Name_Task_Dispatching_Policy        : constant Name_Id := N + $;
+   Name_Unevaluated_Use_Of_Old         : constant Name_Id := N + $; -- GNAT
    Name_Universal_Data                 : constant Name_Id := N + $; -- AAMP
    Name_Unsuppress                     : constant Name_Id := N + $; -- Ada 05
    Name_Use_VADS_Size                  : constant Name_Id := N + $; -- GNAT
@@ -687,6 +688,7 @@ package Snames is
 
    --  Other special names used in processing pragmas
 
+   Name_Allow                          : constant Name_Id := N + $;
    Name_Amount                         : constant Name_Id := N + $;
    Name_As_Is                          : constant Name_Id := N + $;
    Name_Assertion                      : constant Name_Id := N + $;
@@ -811,6 +813,7 @@ package Snames is
    Name_Vector                         : constant Name_Id := N + $;
    Name_VMS                            : constant Name_Id := N + $;
    Name_Vtable_Ptr                     : constant Name_Id := N + $;
+   Name_Warn                           : constant Name_Id := N + $;
    Name_Working_Storage                : constant Name_Id := N + $;
 
    --  Names of recognized attributes. The entries with the comment "Ada 83"
@@ -1791,6 +1794,7 @@ package Snames is
       Pragma_Suppress,
       Pragma_Suppress_Exception_Locations,
       Pragma_Task_Dispatching_Policy,
+      Pragma_Unevaluated_Use_Of_Old,
       Pragma_Universal_Data,
       Pragma_Unsuppress,
       Pragma_Use_VADS_Size,