prj.ads, [...]: Minor reformatting.
authorRobert Dewar <dewar@adacore.com>
Wed, 7 Jan 2015 08:49:42 +0000 (08:49 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Wed, 7 Jan 2015 08:49:42 +0000 (09:49 +0100)
2015-01-07  Robert Dewar  <dewar@adacore.com>

* prj.ads, i-cpoint.adb, freeze.adb, ghost.adb, prj-err.adb: Minor
reformatting.

2015-01-07  Robert Dewar  <dewar@adacore.com>

* restrict.adb (Check_Restriction_No_Use_Of_Attribute):
New procedure.
(OK_No_Use_Of_Entity_Name): New function.
(Set_Restriction_No_Use_Of_Entity): New procedure.
* restrict.ads (Check_Restriction_No_Use_Of_Attribute):
New procedure.
(OK_No_Use_Of_Entity_Name): New function.
(Set_Restriction_No_Use_Of_Entity): New procedure.
* sem_ch8.adb (Find_Direct_Name): Add check for violation of
No_Use_Of_Entity.
* sem_prag.adb (Process_Restrictions_Or_Restriction_Warnings):
Add processing for new restriction No_Use_Of_Entity.

From-SVN: r219282

gcc/ada/ChangeLog
gcc/ada/freeze.adb
gcc/ada/ghost.adb
gcc/ada/i-cpoint.adb
gcc/ada/prj-err.adb
gcc/ada/prj.ads
gcc/ada/restrict.adb
gcc/ada/restrict.ads
gcc/ada/sem_ch8.adb
gcc/ada/sem_prag.adb

index bceb082..25920e3 100644 (file)
@@ -1,3 +1,23 @@
+2015-01-07  Robert Dewar  <dewar@adacore.com>
+
+       * prj.ads, i-cpoint.adb, freeze.adb, ghost.adb, prj-err.adb: Minor
+       reformatting.
+
+2015-01-07  Robert Dewar  <dewar@adacore.com>
+
+       * restrict.adb (Check_Restriction_No_Use_Of_Attribute):
+       New procedure.
+       (OK_No_Use_Of_Entity_Name): New function.
+       (Set_Restriction_No_Use_Of_Entity): New procedure.
+       * restrict.ads (Check_Restriction_No_Use_Of_Attribute):
+       New procedure.
+       (OK_No_Use_Of_Entity_Name): New function.
+       (Set_Restriction_No_Use_Of_Entity): New procedure.
+       * sem_ch8.adb (Find_Direct_Name): Add check for violation of
+       No_Use_Of_Entity.
+       * sem_prag.adb (Process_Restrictions_Or_Restriction_Warnings):
+       Add processing for new restriction No_Use_Of_Entity.
+
 2015-01-07  Eric Botcazou  <ebotcazou@adacore.com>
 
        * freeze.adb (Freeze_Array_Type): Apply same handling to Is_Atomic
index a8acdc3..ab128f2 100644 (file)
@@ -2435,8 +2435,8 @@ package body Freeze is
             --  packing or explicit component size clause given.
 
             if (Has_Aliased_Components (Arr)
-                  or else
-                Has_Atomic_Components (Arr) or else Is_Atomic (Ctyp))
+                 or else Has_Atomic_Components (Arr)
+                 or else Is_Atomic (Ctyp))
               and then
                 (Has_Component_Size_Clause (Arr) or else Is_Packed (Arr))
             then
@@ -7801,11 +7801,16 @@ package body Freeze is
          if (SSO_Set_Low_By_Default (T) or else SSO_Set_High_By_Default (T))
 
            --  For a record type, if bit order is specified explicitly, then
-           --  do not set SSO from default if not consistent.
+           --  do not set SSO from default if not consistent. Note that we
+           --  do not want to look at a Bit_Order attribute definition for
+           --  a parent: if we were to inherit Bit_Order, then both
+           --  SSO_Set_*_By_Default flags would have been cleared already
+           --  (by Inherit_Aspects_At_Freeze_Point).
 
            and then not
              (Is_Record_Type (T)
-               and then Has_Rep_Item (T, Name_Bit_Order)
+               and then Has_Rep_Item (T,
+                          Name_Bit_Order, Check_Parents => False)
                and then Reverse_Bit_Order (T) /= Reversed)
          then
             --  If flags cause reverse storage order, then set the result. Note
index b69c74e..2c3be8f 100644 (file)
@@ -82,7 +82,7 @@ package body Ghost is
       for Index in reverse Ignored_Ghost_Units.First ..
                            Ignored_Ghost_Units.Last
       loop
-         --  The unit is already present in the table, do not add it again
+         --  If the unit is already present in the table, do not add it again
 
          if Unit = Ignored_Ghost_Units.Table (Index) then
             return;
@@ -260,11 +260,10 @@ package body Ghost is
                Ref : Node_Id;
 
             begin
-               Ref := N;
-
                --  When the reference extracts a subcomponent, recover the
                --  related object (SPARK RM 6.9(1)).
 
+               Ref := N;
                while Nkind_In (Ref, N_Explicit_Dereference,
                                     N_Indexed_Component,
                                     N_Selected_Component,
@@ -884,11 +883,10 @@ package body Ghost is
       elsif Nkind_In (N, N_Assignment_Statement,
                          N_Procedure_Call_Statement)
       then
-         Nam := Name (N);
-
          --  When the reference extracts a subcomponent, recover the related
          --  object (SPARK RM 6.9(1)).
 
+         Nam := Name (N);
          while Nkind_In (Nam, N_Explicit_Dereference,
                               N_Indexed_Component,
                               N_Selected_Component,
@@ -922,10 +920,8 @@ package body Ghost is
    begin
       if Is_Checked_Ghost_Entity (Id) then
          Ghost_Mode := Check;
-
       elsif Is_Ignored_Ghost_Entity (Id) then
          Ghost_Mode := Ignore;
-
          Propagate_Ignored_Ghost_Code (N);
       end if;
    end Set_Ghost_Mode_For_Freeze;
@@ -936,11 +932,9 @@ package body Ghost is
 
    procedure Set_Is_Ghost_Entity (Id : Entity_Id) is
       Policy : constant Name_Id := Policy_In_Effect (Name_Ghost);
-
    begin
       if Policy = Name_Check then
          Set_Is_Checked_Ghost_Entity (Id);
-
       elsif Policy = Name_Ignore then
          Set_Is_Ignored_Ghost_Entity (Id);
       end if;
index 0f17bb2..afcb96b 100644 (file)
@@ -109,22 +109,22 @@ package body Interfaces.C.Pointers is
       if Source = null or else Target = null then
          raise Dereference_Error;
 
+      --  Forward copy
+
       elsif To_Addr (Target) <= To_Addr (Source) then
-         --  Forward copy
          T := Target;
          S := Source;
-
          for J in 1 .. Length loop
             T.all := S.all;
             Increment (T);
             Increment (S);
          end loop;
 
+      --  Backward copy
+
       else
-         --  Backward copy
          T := Target + Length;
          S := Source + Length;
-
          for J in 1 .. Length loop
             Decrement (T);
             Decrement (S);
index e6e6dd3..44ad905 100644 (file)
@@ -72,6 +72,8 @@ package body Prj.Err is
       Real_Location : Source_Ptr := Location;
 
    begin
+      --  Don't post message if incompleted with's (avoid junk cascaded errors)
+
       if Flags.Incomplete_Withs then
          return;
       end if;
index 935f3de..ac55681 100644 (file)
@@ -2052,7 +2052,7 @@ private
       Missing_Source_Files       : Error_Warning;
       Ignore_Missing_With        : Boolean;
 
-      Incomplete_Withs           : Boolean := False;
+      Incomplete_Withs : Boolean := False;
       --  This flag is set to True when the projects are parsed while ignoring
       --  missing withed project and some withed projects are not found.
 
index 13732fb..661a05a 100644 (file)
@@ -128,6 +128,10 @@ package body Restrict is
    --  real violation, serious vs non-serious, implicit vs explicit, the second
    --  message giving the profile name if needed, and the location information.
 
+   function Same_Entity (E1, E2 : Node_Id) return Boolean;
+   --  Returns True iff E1 and E2 represent the same entity. Used for handling
+   --  of No_Use_Of_Entity => fully_qualified_ENTITY restriction case.
+
    function Same_Unit (U1, U2 : Node_Id) return Boolean;
    --  Returns True iff U1 and U2 represent the same library unit. Used for
    --  handling of No_Dependence => Unit restriction case.
@@ -681,6 +685,98 @@ package body Restrict is
    end Check_Restriction_No_Use_Of_Attribute;
 
    ----------------------------------------
+   -- Check_Restriction_No_Use_Of_Entity --
+   ----------------------------------------
+
+   procedure Check_Restriction_No_Use_Of_Entity (N : Node_Id) is
+   begin
+      --  Error defence (not clearly necessary, but better safe)
+
+      if No (Entity (N)) then
+         return;
+      end if;
+
+      --  If simple name of entity not flagged with Boolean2 flag, then there
+      --  cannot be a matching entry in the table, so skip the search.
+
+      if Get_Name_Table_Boolean2 (Chars (Entity (N))) = False then
+         return;
+      end if;
+
+      --  Restriction is only recognized within a configuration
+      --  pragma file, or within a unit of the main extended
+      --  program. Note: the test for Main_Unit is needed to
+      --  properly include the case of configuration pragma files.
+
+      if Current_Sem_Unit /= Main_Unit
+        and then not In_Extended_Main_Source_Unit (N)
+      then
+         return;
+      end if;
+
+      --  Here we must search the table
+
+      for J in No_Use_Of_Entity.First .. No_Use_Of_Entity.Last loop
+         declare
+            NE_Ent : NE_Entry renames No_Use_Of_Entity.Table (J);
+            Ent    : Entity_Id;
+            Expr   : Node_Id;
+
+         begin
+            Ent  := Entity (N);
+            Expr := NE_Ent.Entity;
+            loop
+               --  Here if at outer level of entity name in reference
+
+               if Scope (Ent) = Standard_Standard then
+                  if Nkind_In (Expr, N_Identifier, N_Operator_Symbol)
+                    and then Chars (Ent) = Chars (Expr)
+                  then
+                     Error_Msg_Node_1 := N;
+                     Error_Msg_Warn := NE_Ent.Warn;
+                     Error_Msg_Sloc := Sloc (NE_Ent.Entity);
+                     Error_Msg_N
+                       ("<*<reference to & violates restriction "
+                        & "No_Use_Of_Entity #", N);
+                     return;
+
+                  else
+                     goto Continue;
+                  end if;
+
+               --  Here if at outer level of entity name in table
+
+               elsif Nkind_In (Expr, N_Identifier, N_Operator_Symbol) then
+                  goto Continue;
+
+               --  Here if neither at the outer level
+
+               else
+                  pragma Assert (Nkind (Expr) = N_Selected_Component);
+
+                  if Chars (Selector_Name (Expr)) /= Chars (Ent) then
+                     goto Continue;
+                  end if;
+               end if;
+
+               --  Move up a level
+
+               loop
+                  Ent := Scope (Ent);
+                  exit when not Is_Internal_Name (Chars (Ent));
+               end loop;
+
+               Expr := Prefix (Expr);
+
+               --  Entry did not match
+
+               <<Continue>> null;
+            end loop;
+         end;
+      end loop;
+   end Check_Restriction_No_Use_Of_Entity;
+
+   ----------------------------------------
    -- Check_Restriction_No_Use_Of_Pragma --
    ----------------------------------------
 
@@ -864,6 +960,27 @@ package body Restrict is
       end if;
    end OK_No_Dependence_Unit_Name;
 
+   ------------------------------
+   -- OK_No_Use_Of_Entity_Name --
+   ------------------------------
+
+   function OK_No_Use_Of_Entity_Name (N : Node_Id) return Boolean is
+   begin
+      if Nkind (N) = N_Selected_Component then
+         return
+           OK_No_Use_Of_Entity_Name (Prefix (N))
+             and then
+           OK_No_Use_Of_Entity_Name (Selector_Name (N));
+
+      elsif Nkind_In (N, N_Identifier, N_Operator_Symbol) then
+         return True;
+
+      else
+         Error_Msg_N ("wrong form for entity name for No_Use_Of_Entity", N);
+         return False;
+      end if;
+   end OK_No_Use_Of_Entity_Name;
+
    ----------------------------------
    -- Process_Restriction_Synonyms --
    ----------------------------------
@@ -1146,6 +1263,30 @@ package body Restrict is
       end if;
    end Restriction_Msg;
 
+   -----------------
+   -- Same_Entity --
+   -----------------
+
+   function Same_Entity (E1, E2 : Node_Id) return Boolean is
+   begin
+      if Nkind_In (E1, N_Identifier, N_Operator_Symbol)
+           and then
+         Nkind_In (E2, N_Identifier, N_Operator_Symbol)
+      then
+         return Chars (E1) = Chars (E2);
+
+      elsif Nkind_In (E1, N_Selected_Component, N_Expanded_Name)
+              and then
+            Nkind_In (E2, N_Selected_Component, N_Expanded_Name)
+      then
+         return Same_Unit (Prefix (E1), Prefix (E2))
+                  and then
+                Same_Unit (Selector_Name (E1), Selector_Name (E2));
+      else
+         return False;
+      end if;
+   end Same_Entity;
+
    ---------------
    -- Same_Unit --
    ---------------
@@ -1360,6 +1501,54 @@ package body Restrict is
       No_Dependences.Append ((Unit, Warn, Profile));
    end Set_Restriction_No_Dependence;
 
+   --------------------------------------
+   -- Set_Restriction_No_Use_Of_Entity --
+   --------------------------------------
+
+   procedure Set_Restriction_No_Use_Of_Entity
+     (Entity  : Node_Id;
+      Warn    : Boolean;
+      Profile : Profile_Name := No_Profile)
+   is
+      Nam : Node_Id;
+
+   begin
+      --  Loop to check for duplicate entry
+
+      for J in No_Use_Of_Entity.First .. No_Use_Of_Entity.Last loop
+
+         --  Case of entry already in table
+
+         if Same_Entity (Entity, No_Use_Of_Entity.Table (J).Entity) then
+
+            --  Error has precedence over warning
+
+            if not Warn then
+               No_Use_Of_Entity.Table (J).Warn := False;
+            end if;
+
+            return;
+         end if;
+      end loop;
+
+      --  Entry is not currently in table
+
+      No_Use_Of_Entity.Append ((Entity, Warn, Profile));
+
+      --  Now we need to find the direct name and set Boolean2 flag
+
+      if Nkind_In (Entity, N_Identifier, N_Operator_Symbol) then
+         Nam := Entity;
+
+      else
+         pragma Assert (Nkind (Entity) = N_Selected_Component);
+         Nam := Selector_Name (Entity);
+         pragma Assert (Nkind_In (Nam, N_Identifier, N_Operator_Symbol));
+      end if;
+
+      Set_Name_Table_Boolean2 (Chars (Nam), True);
+   end Set_Restriction_No_Use_Of_Entity;
+
    ------------------------------------------------
    -- Set_Restriction_No_Specification_Of_Aspect --
    ------------------------------------------------
index a25dcee..e683a71 100644 (file)
@@ -273,16 +273,6 @@ package Restrict is
    --  Wrapper on Check_Restriction with Msg_Issued, with the out-parameter
    --  being ignored here.
 
-   procedure Check_Restriction_No_Use_Of_Attribute (N : Node_Id);
-   --  N is the node of an attribute definition clause. An error message
-   --  (warning) will be issued if a restriction (warning) was previously set
-   --  for this attribute using Set_No_Use_Of_Attribute.
-
-   procedure Check_Restriction_No_Use_Of_Pragma (N : Node_Id);
-   --  N is the node of a pragma. An error message (warning) will be issued
-   --  if a restriction (warning) was previously set for this pragma using
-   --  Set_No_Use_Of_Pragma.
-
    procedure Check_Restriction_No_Dependence (U : Node_Id; Err : Node_Id);
    --  Called when a dependence on a unit is created (either implicitly, or by
    --  an explicit WITH clause). U is a node for the unit involved, and Err is
@@ -293,6 +283,21 @@ package Restrict is
    --  (warning) will be issued if a restriction (warning) was previous set
    --  for this aspect using Set_No_Specification_Of_Aspect.
 
+   procedure Check_Restriction_No_Use_Of_Attribute (N : Node_Id);
+   --  N is the node of an attribute definition clause. An error message
+   --  (warning) will be issued if a restriction (warning) was previously set
+   --  for this attribute using Set_No_Use_Of_Attribute.
+
+   procedure Check_Restriction_No_Use_Of_Entity (N : Node_Id);
+   --  N is the node id for an entity reference. An error message (warning)
+   --  will be issued if a restriction (warning) was previous set for this
+   --  entity name using Set_No_Use_Of_Entity.
+
+   procedure Check_Restriction_No_Use_Of_Pragma (N : Node_Id);
+   --  N is the node of a pragma. An error message (warning) will be issued
+   --  if a restriction (warning) was previously set for this pragma using
+   --  Set_No_Use_Of_Pragma.
+
    procedure Check_Elaboration_Code_Allowed (N : Node_Id);
    --  Tests to see if elaboration code is allowed by the current restrictions
    --  settings. This function is called by Gigi when it needs to define an
@@ -356,6 +361,11 @@ package Restrict is
    --  pragma Restrictions_Warning, or attribute Restriction_Set. Returns
    --  True if N has the proper form for a unit name, False otherwise.
 
+   function OK_No_Use_Of_Entity_Name (N : Node_Id) return Boolean;
+   --  Used in checking No_Use_Of_Entity argument of pragma Restrictions or
+   --  pragma Restrictions_Warning, or attribute Restriction_Set. Returns
+   --  True if N has the proper form for an entity name, False otherwise.
+
    function Is_In_Hidden_Part_In_SPARK (Loc : Source_Ptr) return Boolean;
    --  Determine if given location is covered by a hidden region range in the
    --  SPARK hides table.
@@ -460,6 +470,18 @@ package Restrict is
    --  No_Use_Of_Attribute. Caller has verified that this is a valid attribute
    --  designator.
 
+   procedure Set_Restriction_No_Use_Of_Entity
+     (Entity  : Node_Id;
+      Warn    : Boolean;
+      Profile : Profile_Name := No_Profile);
+   --  Sets given No_Use_Of_Entity restriction in table if not there already.
+   --  Warn is True if from Restriction_Warnings, or for Restrictions if the
+   --  flag Treat_Restrictions_As_Warnings is set. False if from Restrictions
+   --  and this flag is not set. Profile is set to a non-default value if the
+   --  No_Dependence restriction comes from a Profile pragma. This procedure
+   --  also takes care of setting the Boolean2 flag of the simple name for
+   --  the entity  (to optimize table searches).
+
    procedure Set_Restriction_No_Use_Of_Pragma
      (N       : Node_Id;
       Warning : Boolean);
index 8c77314..26b697f 100644 (file)
@@ -5235,7 +5235,7 @@ package body Sem_Ch8 is
          Nvis_Messages;
       end if;
 
-      return;
+      goto Done;
 
       --  Processing for a potentially use visible entry found. We must search
       --  the rest of the homonym chain for two reasons. First, if there is a
@@ -5345,7 +5345,7 @@ package body Sem_Ch8 is
                end loop;
 
                Nvis_Messages;
-               return;
+               goto Done;
 
             elsif
               Is_Predefined_File_Name (Unit_File_Name (Current_Sem_Unit))
@@ -5372,7 +5372,7 @@ package body Sem_Ch8 is
 
             else
                Nvis_Messages;
-               return;
+               goto Done;
             end if;
          end if;
       end;
@@ -5477,9 +5477,8 @@ package body Sem_Ch8 is
            and then Expander_Active
            and then Get_PCS_Name /= Name_No_DSA
          then
-            Rewrite (N,
-              New_Occurrence_Of (Equivalent_Type (E), Sloc (N)));
-            return;
+            Rewrite (N, New_Occurrence_Of (Equivalent_Type (E), Sloc (N)));
+            goto Done;
          end if;
 
          --  Set the entity. Note that the reason we call Set_Entity for the
@@ -5634,6 +5633,11 @@ package body Sem_Ch8 is
             end if;
          end if;
       end;
+
+   --  Come here with entity set
+
+   <<Done>>
+      Check_Restriction_No_Use_Of_Entity (N);
    end Find_Direct_Name;
 
    ------------------------
index dd2bc1b..59a54ee 100644 (file)
@@ -8895,12 +8895,25 @@ package body Sem_Prag is
                   Set_Restriction_No_Use_Of_Attribute (Expr, Warn);
                end if;
 
-            --  Case of No_Use_Of_Entity => fully-qualified-name. Note that the
-            --  parser already processed this case commpletely, including error
-            --  checking and making an entry in the No_Use_Of_Entity table.
+            --  Case of No_Use_Of_Entity => fully-qualified-name
 
             elsif Id = Name_No_Use_Of_Entity then
-               null;
+
+               --  Restriction is only recognized within a configuration
+               --  pragma file, or within a unit of the main extended
+               --  program. Note: the test for Main_Unit is needed to
+               --  properly include the case of configuration pragma files.
+
+               if Current_Sem_Unit = Main_Unit
+                 or else In_Extended_Main_Source_Unit (N)
+               then
+                  if not OK_No_Dependence_Unit_Name (Expr) then
+                     Error_Msg_N ("wrong form for entity name", Expr);
+                  else
+                     Set_Restriction_No_Use_Of_Entity
+                       (Expr, Warn, No_Profile);
+                  end if;
+               end if;
 
             --  Case of No_Use_Of_Pragma => pragma-identifier
 
@@ -8909,7 +8922,6 @@ package body Sem_Prag is
                  or else not Is_Pragma_Name (Chars (Expr))
                then
                   Error_Msg_N ("unknown pragma name??", Expr);
-
                else
                   Set_Restriction_No_Use_Of_Pragma (Expr, Warn);
                end if;
@@ -14941,7 +14953,7 @@ package body Sem_Prag is
          -- Independent_Components --
          ----------------------------
 
-         --  pragma Atomic_Components (array_or_record_LOCAL_NAME);
+         --  pragma Independent_Components (array_or_record_LOCAL_NAME);
 
          when Pragma_Independent_Components => Independent_Components : declare
             E_Id : Node_Id;