[Ada] Spurious error in instance nested in formal package

Message ID 20200716092051.GA146578@adacore.com
State New
Headers show
Series
  • [Ada] Spurious error in instance nested in formal package
Related show

Commit Message

Pierre-Marie de Rodat July 16, 2020, 9:20 a.m.
This patch removes a spurious error in a compilation of a generic body
GB that includes a formal package whose source GF includes a nested
generic package NGF, and GB includes instances of NGF and of further
generic units declared within NGF.

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

gcc/ada/

	* sem_ch12.adb (Load_Parent_Of_Generic): If an ancestor is an
	instance whose source appears within a formal package of the
	current unit, there is no body of the ancestor needed to
	complete the current generic compilation.

Patch

diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -14292,6 +14292,21 @@  package body Sem_Ch12 is
 
                exit;
 
+            --  If an ancestor of the generic comes from a formal package
+            --  there is no source for the ancestor body. This is detected
+            --  by examining the scope of the ancestor and its declaration.
+            --  The body, if any is needed, will be available when the
+            --  current unit (containing a formal package) is instantiated.
+
+            elsif Nkind (True_Parent) = N_Package_Specification
+              and then Present (Generic_Parent (True_Parent))
+              and then Nkind
+                (Original_Node (Unit_Declaration_Node
+                  (Scope (Generic_Parent (True_Parent)))))
+                     = N_Formal_Package_Declaration
+            then
+               return;
+
             else
                True_Parent := Parent (True_Parent);
             end if;