[Ada] Remove special handling for package declaring abstract state

Arnaud Charlet charlet@adacore.com
Thu Oct 17 14:16:00 GMT 2013


On the basis of further discussion, we decided not to implement the
rule saying that a package body must be required for some other
reason if an abstract state is declared. Now we just say a package
body is required if a non-null abstract state and that's it! This
change undoes the error message. So if we compile the following
with -gnatd.V -gnatld7 (but without -gnatc), we get

cannot generate code for file nnas.ads (package spec)

Compiling: nnas.ads

     1. package NNAS
     2.    with Abstract_State => State
     3. is
     4.    --  package declarations with non-null
     5.    --  Abstract State shall have bodies.
     6. end NNAS;

 6 lines: No errors

The "cannot generate" line reflects the fact that this package
spec requires a body, so the spec cannot be compiled alone.

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

2013-10-17  Robert Dewar  <dewar@adacore.com>

	* sem_ch7.adb (Analyze_Package_Specification): Remove circuit
	for ensuring that a package spec requires a body for some other
	reason than that it contains the declaration of an abstract state.

-------------- next part --------------
Index: sem_ch7.adb
===================================================================
--- sem_ch7.adb	(revision 203755)
+++ sem_ch7.adb	(working copy)
@@ -1493,34 +1493,6 @@
 
       Check_One_Tagged_Type_Or_Extension_At_Most;
 
-      --  Issue an error if a package that is a library unit does not require a
-      --  body, and we have a non-null abstract state (SPARK LRM 7.1.5(4)).
-
-      if not Unit_Requires_Body (Id, Ignore_Abstract_State => True)
-        and then Present (Abstract_States (Id))
-
-        --  We use Scope_Depth of 1 to identify library units, which seems a
-        --  bit ugly, but there doesn't seem to be an easier way.
-
-        and then Scope_Depth (Id) = 1
-
-        --  A null abstract state always appears as the sole element of the
-        --  state list.
-
-        and then not Is_Null_State (Node (First_Elmt (Abstract_States (Id))))
-      then
-         declare
-            P : constant Node_Id := Get_Pragma (Id, Pragma_Abstract_State);
-         begin
-            Error_Msg_NE
-              ("package & specifies a non-null abstract state", P, Id);
-            Error_Msg_N
-              ("\but package does not otherwise require a body", P);
-            Error_Msg_N
-              ("\pragma Elaborate_Body is required in this case", P);
-         end;
-      end if;
-
       --  If switch set, output information on why body required
 
       if List_Body_Required_Info


More information about the Gcc-patches mailing list