[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Fri, 7 Nov 2014 13:47:31 +0000 (14:47 +0100)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 7 Nov 2014 13:47:31 +0000 (14:47 +0100)
2014-11-07  Hristian Kirtchev  <kirtchev@adacore.com>

* freeze.adb (Freeze_Entity): Issue an error regardless of the
SPARK_Mode when a ghost type is effectively volatile.
* sem_ch3.adb (Analyze_Object_Contract): Decouple the checks
related to Ghost from SPARK_Mode.
* sem_res.adb (Check_Ghost_Policy): Issue an error regardless
of the SPARK_Mode when the Ghost policies do not match.
* sem_util.adb (Check_Ghost_Completion): Issue an error regardless
of the SPARK_Mode when the Ghost policies do not match.

2014-11-07  Ed Schonberg  <schonberg@adacore.com>

* sem_ch5.adb (Analyze_Iterator_Specification): return if name
in iterator does not have any usable aspect for iteration.

2014-11-07  Ed Schonberg  <schonberg@adacore.com>

* sem_ch6.adb (Analyze_Null_Procedure): Reject a null procedure
that there is a previous null procedure in scope with a matching
profile.

2014-11-07  Hristian Kirtchev  <kirtchev@adacore.com>

* atree.adb (Copy_Separate_Tree): Copy the aspect specifications.
* inline.adb (Has_Some_Contract): Do the check only when the
related entity has been analyzed.

From-SVN: r217224

gcc/ada/ChangeLog
gcc/ada/atree.adb
gcc/ada/freeze.adb
gcc/ada/inline.adb
gcc/ada/sem_ch3.adb
gcc/ada/sem_ch5.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_res.adb
gcc/ada/sem_util.adb

index e7fedaa586bc37accae6593951731322323de5b8..3386f6a9911a5d2af29966df5eee84639891e840 100644 (file)
@@ -1,3 +1,31 @@
+2014-11-07  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * freeze.adb (Freeze_Entity): Issue an error regardless of the
+       SPARK_Mode when a ghost type is effectively volatile.
+       * sem_ch3.adb (Analyze_Object_Contract): Decouple the checks
+       related to Ghost from SPARK_Mode.
+       * sem_res.adb (Check_Ghost_Policy): Issue an error regardless
+       of the SPARK_Mode when the Ghost policies do not match.
+       * sem_util.adb (Check_Ghost_Completion): Issue an error regardless
+       of the SPARK_Mode when the Ghost policies do not match.
+
+2014-11-07  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch5.adb (Analyze_Iterator_Specification): return if name
+       in iterator does not have any usable aspect for iteration.
+
+2014-11-07  Ed Schonberg  <schonberg@adacore.com>
+
+       * sem_ch6.adb (Analyze_Null_Procedure): Reject a null procedure
+       that there is a previous null procedure in scope with a matching
+       profile.
+
+2014-11-07  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * atree.adb (Copy_Separate_Tree): Copy the aspect specifications.
+       * inline.adb (Has_Some_Contract): Do the check only when the
+       related entity has been analyzed.
+
 2014-11-07  Ed Schonberg  <schonberg@adacore.com>
 
        * exp_fixd.adb (Expand_Multiply_Fixed_By_Fixed_Giving_Integer):
index 2af7e2e48b9378b6b13e894e8bf1520ffa3d614e..eb196e4fa1c59f45ae0ffe9b0cf1d4e0194271c4 100644 (file)
@@ -892,6 +892,16 @@ package body Atree is
          Set_Field4 (New_Id, Possible_Copy (Field4 (New_Id)));
          Set_Field5 (New_Id, Possible_Copy (Field5 (New_Id)));
 
+         --  Explicitly copy the aspect specifications as those do not reside
+         --  in a node field.
+
+         if Permits_Aspect_Specifications (Source)
+           and then Has_Aspects (Source)
+         then
+            Set_Aspect_Specifications
+              (New_Id, Copy_List (Aspect_Specifications (Source)));
+         end if;
+
          --  Set Entity field to Empty to ensure that no entity references
          --  are shared between the two, if the source is already analyzed.
 
index d98645c0cab127eb4b1fffbbff78036a54624b50..9ba6f24c734f1fc6fd2d644a1413f508e88cee12 100644 (file)
@@ -2398,6 +2398,24 @@ package body Freeze is
                         Set_Has_Non_Standard_Rep (Base_Type (Arr), True);
                         Set_Is_Bit_Packed_Array  (Base_Type (Arr), True);
                         Set_Is_Packed            (Base_Type (Arr), True);
+
+                        --  Make sure that we have the necessary routines to
+                        --  implement the packing, and complain now if not.
+
+                        declare
+                           CS : constant Int   := UI_To_Int (Csiz);
+                           RE : constant RE_Id := Get_Id (CS);
+
+                        begin
+                           if RE /= RE_Null
+                             and then not RTE_Available (RE)
+                           then
+                              Error_Msg_CRT
+                                ("packing of " & UI_Image (Csiz)
+                                 & "-bit components",
+                                 First_Subtype (Etype (Arr)));
+                           end if;
+                        end;
                      end if;
                   end;
                end if;
@@ -2650,37 +2668,6 @@ package body Freeze is
             Create_Packed_Array_Impl_Type (Arr);
             Freeze_And_Append (Packed_Array_Impl_Type (Arr), N, Result);
 
-            --  Make sure that we have the necessary routines to implement the
-            --  packing, and complain now if not. Note that we only test this
-            --  for constrained array types.
-
-            if Is_Constrained (Arr)
-              and then Is_Bit_Packed_Array (Arr)
-              and then Present (Packed_Array_Impl_Type (Arr))
-              and then Is_Array_Type (Packed_Array_Impl_Type (Arr))
-            then
-               declare
-                  CS : constant Uint  := Component_Size (Arr);
-                  RE : constant RE_Id := Get_Id (UI_To_Int (CS));
-
-               begin
-                  if RE /= RE_Null
-                    and then not RTE_Available (RE)
-                  then
-                     Error_Msg_CRT
-                       ("packing of " & UI_Image (CS) & "-bit components",
-                        First_Subtype (Etype (Arr)));
-
-                     --  Cancel the packing
-
-                     Set_Is_Packed (Base_Type (Arr), False);
-                     Set_Is_Bit_Packed_Array (Base_Type (Arr), False);
-                     Set_Packed_Array_Impl_Type (Arr, Empty);
-                     goto Skip_Packed;
-                  end if;
-               end;
-            end if;
-
             --  Size information of packed array type is copied to the array
             --  type, since this is really the representation. But do not
             --  override explicit existing size values. If the ancestor subtype
@@ -2702,8 +2689,6 @@ package body Freeze is
             end if;
          end if;
 
-         <<Skip_Packed>>
-
          --  For non-packed arrays set the alignment of the array to the
          --  alignment of the component type if it is unknown. Skip this
          --  in atomic case (atomic arrays may need larger alignments).
@@ -4835,7 +4820,7 @@ package body Freeze is
          if Is_Ghost_Entity (E)
            and then Is_Effectively_Volatile (E)
          then
-            SPARK_Msg_N ("ghost type & cannot be volatile", E);
+            Error_Msg_N ("ghost type & cannot be volatile", E);
          end if;
 
          --  Deal with special cases of freezing for subtype
index 9646cc2fdc715d9b872e82d031c40c85aec2dba0..812002b4ed07382790d754ffa08b7f184cecc2ad 100644 (file)
@@ -1316,12 +1316,23 @@ package body Inline is
       -----------------------
 
       function Has_Some_Contract (Id : Entity_Id) return Boolean is
-         Items : constant Node_Id := Contract (Id);
+         Items : Node_Id;
+
       begin
-         return Present (Items)
-           and then (Present (Pre_Post_Conditions (Items)) or else
-                     Present (Contract_Test_Cases (Items)) or else
-                     Present (Classifications     (Items)));
+         --  A call to an expression function may precede the actual body which
+         --  is inserted at the end of the enclosing declarations. Ensure that
+         --  the related entity is analyzed before inspecting the contract.
+
+         if Analyzed (Id) then
+            Items := Contract (Id);
+
+            return Present (Items)
+              and then (Present (Pre_Post_Conditions (Items)) or else
+                        Present (Contract_Test_Cases (Items)) or else
+                        Present (Classifications     (Items)));
+         end if;
+
+         return False;
       end Has_Some_Contract;
 
       -----------------------------
index 8579e0833135aca5f2c566bfa58aa199d9fc3956..969283251e842c07466f9e8f1b9555cac900c7f3 100644 (file)
@@ -3185,24 +3185,22 @@ package body Sem_Ch3 is
                      Obj_Id);
                end if;
             end if;
+         end if;
 
-            if Is_Ghost_Entity (Obj_Id) then
+         if Is_Ghost_Entity (Obj_Id) then
 
-               --  A Ghost object cannot be effectively volatile
-               --  (SPARK RM 6.9(8)).
+            --  A Ghost object cannot be effectively volatile (SPARK RM 6.9(8))
 
-               if Is_Effectively_Volatile (Obj_Id) then
-                  SPARK_Msg_N ("ghost variable & cannot be volatile", Obj_Id);
+            if Is_Effectively_Volatile (Obj_Id) then
+               Error_Msg_N ("ghost variable & cannot be volatile", Obj_Id);
 
-               --  A Ghost object cannot be imported or exported
-               --  (SPARK RM 6.9(8)).
+            --  A Ghost object cannot be imported or exported (SPARK RM 6.9(8))
 
-               elsif Is_Imported (Obj_Id) then
-                  SPARK_Msg_N ("ghost object & cannot be imported", Obj_Id);
+            elsif Is_Imported (Obj_Id) then
+               Error_Msg_N ("ghost object & cannot be imported", Obj_Id);
 
-               elsif Is_Exported (Obj_Id) then
-                  SPARK_Msg_N ("ghost object & cannot be exported", Obj_Id);
-               end if;
+            elsif Is_Exported (Obj_Id) then
+               Error_Msg_N ("ghost object & cannot be exported", Obj_Id);
             end if;
          end if;
 
@@ -3256,10 +3254,10 @@ package body Sem_Ch3 is
 
       if Is_Ghost_Entity (Obj_Id) then
          if Is_Exported (Obj_Id) then
-            SPARK_Msg_N ("ghost object & cannot be exported", Obj_Id);
+            Error_Msg_N ("ghost object & cannot be exported", Obj_Id);
 
          elsif Is_Imported (Obj_Id) then
-            SPARK_Msg_N ("ghost object & cannot be imported", Obj_Id);
+            Error_Msg_N ("ghost object & cannot be imported", Obj_Id);
          end if;
       end if;
    end Analyze_Object_Contract;
@@ -4788,8 +4786,6 @@ package body Sem_Ch3 is
 
             when Class_Wide_Kind =>
                Set_Ekind                (Id, E_Class_Wide_Subtype);
-               Set_First_Entity         (Id, First_Entity       (T));
-               Set_Last_Entity          (Id, Last_Entity        (T));
                Set_Class_Wide_Type      (Id, Class_Wide_Type    (T));
                Set_Cloned_Subtype       (Id, T);
                Set_Is_Tagged_Type       (Id, True);
index 0e09a02acf739537982e2a41e6ead943c9e4f2eb..2a809be40f46de6b7a2e58df47215eb65e7c1776 100644 (file)
@@ -2063,6 +2063,10 @@ package body Sem_Ch5 is
                   Error_Msg_NE
                     ("\to iterate directly over the elements of a container, "
                      & "write `of &`", Name (N), Original_Node (Name (N)));
+
+                  --  No point in continuing analysis of iterator spec.
+
+                  return;
                end if;
             end if;
 
index 1ef29c553870e2162c60fa0542a144152d707cdf..8536aa6500719c7d9308549b64e7eff696e6b60d 100644 (file)
@@ -1453,6 +1453,11 @@ package body Sem_Ch6 is
          --  there are various error checks that are applied on this body
          --  when it is analyzed (e.g. correct aspect placement).
 
+         if Has_Completion (Prev) then
+            Error_Msg_Sloc := Sloc (Prev);
+            Error_Msg_NE ("duplicate body for & declared#", N, Prev);
+         end if;
+
          Is_Completion := True;
          Rewrite (N, Null_Body);
          Analyze (N);
index 893e1e15ed8897b518e0f3cb4bbcd9a2ee07d341..0b295f9faa3c524b051fa7c4a5621430c3ed9501 100644 (file)
@@ -846,16 +846,16 @@ package body Sem_Res is
          if Is_Checked_Ghost_Entity (Id) and then Policy = Name_Ignore then
             Error_Msg_Sloc := Sloc (Err_N);
 
-            SPARK_Msg_N  ("incompatible ghost policies in effect", Err_N);
-            SPARK_Msg_NE ("\& declared with ghost policy Check", Err_N, Id);
-            SPARK_Msg_NE ("\& used # with ghost policy Ignore", Err_N, Id);
+            Error_Msg_N  ("incompatible ghost policies in effect", Err_N);
+            Error_Msg_NE ("\& declared with ghost policy Check", Err_N, Id);
+            Error_Msg_NE ("\& used # with ghost policy Ignore", Err_N, Id);
 
          elsif Is_Ignored_Ghost_Entity (Id) and then Policy = Name_Check then
             Error_Msg_Sloc := Sloc (Err_N);
 
-            SPARK_Msg_N  ("incompatible ghost policies in effect", Err_N);
-            SPARK_Msg_NE ("\& declared with ghost policy Ignore", Err_N, Id);
-            SPARK_Msg_NE ("\& used # with ghost policy Check", Err_N, Id);
+            Error_Msg_N  ("incompatible ghost policies in effect", Err_N);
+            Error_Msg_NE ("\& declared with ghost policy Ignore", Err_N, Id);
+            Error_Msg_NE ("\& used # with ghost policy Check", Err_N, Id);
          end if;
       end Check_Ghost_Policy;
 
@@ -873,7 +873,7 @@ package body Sem_Res is
       --  its behavior or value.
 
       else
-         SPARK_Msg_N
+         Error_Msg_N
            ("ghost entity cannot appear in this context (SPARK RM 6.9(12))",
             Ghost_Ref);
       end if;
@@ -7089,12 +7089,13 @@ package body Sem_Res is
                  ("volatile object cannot appear in this context "
                   & "(SPARK RM 7.1.3(13))", N);
             end if;
+         end if;
+      end if;
 
-         --  A Ghost entity must appear in a specific context
+      --  A Ghost entity must appear in a specific context
 
-         elsif Is_Ghost_Entity (E) and then Comes_From_Source (N) then
-            Check_Ghost_Context (E, N);
-         end if;
+      if Is_Ghost_Entity (E) and then Comes_From_Source (N) then
+         Check_Ghost_Context (E, N);
       end if;
    end Resolve_Entity_Name;
 
index 793120f0bf664847aa81d905bc5a0e3944d1ab8e..fc160e17d361ac3df0642b6f624f60aaf43d3d51 100644 (file)
@@ -2688,18 +2688,18 @@ package body Sem_Util is
       then
          Error_Msg_Sloc := Sloc (Full_View);
 
-         SPARK_Msg_N ("incompatible ghost policies in effect",   Partial_View);
-         SPARK_Msg_N ("\& declared with ghost policy Check",     Partial_View);
-         SPARK_Msg_N ("\& completed # with ghost policy Ignore", Partial_View);
+         Error_Msg_N ("incompatible ghost policies in effect",   Partial_View);
+         Error_Msg_N ("\& declared with ghost policy Check",     Partial_View);
+         Error_Msg_N ("\& completed # with ghost policy Ignore", Partial_View);
 
       elsif Is_Ignored_Ghost_Entity (Partial_View)
         and then Policy = Name_Check
       then
          Error_Msg_Sloc := Sloc (Full_View);
 
-         SPARK_Msg_N ("incompatible ghost policies in effect",  Partial_View);
-         SPARK_Msg_N ("\& declared with ghost policy Ignore",   Partial_View);
-         SPARK_Msg_N ("\& completed # with ghost policy Check", Partial_View);
+         Error_Msg_N ("incompatible ghost policies in effect",  Partial_View);
+         Error_Msg_N ("\& declared with ghost policy Ignore",   Partial_View);
+         Error_Msg_N ("\& completed # with ghost policy Check", Partial_View);
       end if;
    end Check_Ghost_Completion;
 
@@ -2722,8 +2722,8 @@ package body Sem_Util is
       --  The parent type of a Ghost type extension must be Ghost
 
       elsif not Is_Ghost_Entity (Parent_Typ) then
-         SPARK_Msg_N  ("type extension & cannot be ghost", Typ);
-         SPARK_Msg_NE ("\parent type & is not ghost", Typ, Parent_Typ);
+         Error_Msg_N  ("type extension & cannot be ghost", Typ);
+         Error_Msg_NE ("\parent type & is not ghost", Typ, Parent_Typ);
          return;
       end if;
 
@@ -2735,8 +2735,8 @@ package body Sem_Util is
             Iface := Node (Iface_Elmt);
 
             if not Is_Ghost_Entity (Iface) then
-               SPARK_Msg_N  ("type extension & cannot be ghost", Typ);
-               SPARK_Msg_NE ("\interface type & is not ghost", Typ, Iface);
+               Error_Msg_N  ("type extension & cannot be ghost", Typ);
+               Error_Msg_NE ("\interface type & is not ghost", Typ, Iface);
                return;
             end if;