diff mbox

[Ada] Incomplete types and null procedures.

Message ID 20150512150057.GA3141@adacore.com
State New
Headers show

Commit Message

Arnaud Charlet May 12, 2015, 3 p.m. UTC
An untagged incomeplete type is legal in the profile of a null procedure.
This patch remotes a spurious error on such, because the legality check
for the use of an incomplete type was also applied to the subprogram body
generated during expansion of a null procedure declaration.

The following must compile quietly:

   gcc -c c.ads

---
package A is
  type T is abstract tagged limited private;
  procedure Prim (This : in T) is abstract;
  type Access_T is access T;
private
  type T is tagged null record;
end A;
---
package B is
  type T is new Integer;
end B;
---
limited with A;
limited with B;
package C is
  procedure P1 (That : in A.T'Class) is null;
  procedure P2 (That : access A.T'Class) is null;
  procedure P3 (That : in A.Access_T) is null;
  procedure P4 (That : in B.T) is null;
end C;

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

2015-05-12  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch6.adb (Process_Formals): An untagged incomplete type
	is legal in the profile of a null procedure.
diff mbox

Patch

Index: sem_ch6.adb
===================================================================
--- sem_ch6.adb	(revision 223064)
+++ sem_ch6.adb	(working copy)
@@ -9882,6 +9882,7 @@ 
      (T           : List_Id;
       Related_Nod : Node_Id)
    is
+      Context     : constant Node_Id := Parent (Parent (T));
       Param_Spec  : Node_Id;
       Formal      : Entity_Id;
       Formal_Type : Entity_Id;
@@ -10027,6 +10028,8 @@ 
 
                   --  Incomplete formal untagged types are not allowed in
                   --  subprogram bodies (but are legal in their declarations).
+                  --  This excludes bodies created for null procedures, which
+                  --  are basic declarations.
 
                   if Is_Generic_Type (Formal_Type)
                     and then not Is_Tagged_Type (Formal_Type)
@@ -10042,13 +10045,14 @@ 
                      then
                         null;
 
-                     elsif Nkind_In (Parent (Parent (T)), N_Accept_Statement,
-                                                          N_Accept_Alternative,
-                                                          N_Entry_Body,
-                                                          N_Subprogram_Body)
+                     elsif Nkind_In (Context, N_Accept_Statement,
+                                              N_Accept_Alternative,
+                                              N_Entry_Body)
+                       or else (Nkind (Context) = N_Subprogram_Body
+                                 and then Comes_From_Source (Context))
                      then
                         Error_Msg_NE
-                          ("invalid use of untagged incomplete type&",
+                          ("invalid use of untagged incomplete type &",
                            Ptype, Formal_Type);
                      end if;