diff options
author | Ed Schonberg <schonberg@adacore.com> | 2019-07-09 07:54:05 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-09 07:54:05 +0000 |
commit | a74d1bf6af0aaeb693cdbddf924c9af53f92b549 (patch) | |
tree | 9ab3bec342e407244ab1494d783dc5695742b9bb /gcc/ada | |
parent | 554a9844f74932d2c6e9a690d04bfd96b361055b (diff) | |
download | gcc-a74d1bf6af0aaeb693cdbddf924c9af53f92b549.zip gcc-a74d1bf6af0aaeb693cdbddf924c9af53f92b549.tar.gz gcc-a74d1bf6af0aaeb693cdbddf924c9af53f92b549.tar.bz2 |
[Ada] Spurious error when instance of generic is used as formal package
This patch removes a spurious bug on the use of the current instance of
a generic package G as the actual in a nested instantiation of a generic
unit GU that has a formal package whose generic_package name is G. This
is only legal if G has no generic formal part, and the formal package
declaration is declared with a box or without a formal_paxkage_actual
part.
2019-07-09 Ed Schonberg <schonberg@adacore.com>
gcc/ada/
* sem_ch12.adb (Instantiate_Formal_Package): Handle properly the
case where the actual for a formal package in an instance is the
current instance of an enclosing generic package.
(Check_Formal_Packages): If the formal package declaration is
box-initialized or lacks associations altogether, no internal
instance was created to verify conformance, and there is no
validating package to remove from tree.
gcc/testsuite/
* gnat.dg/generic_inst5.adb, gnat.dg/generic_inst6.adb,
gnat.dg/generic_inst6_g1-c.adb, gnat.dg/generic_inst6_g1-c.ads,
gnat.dg/generic_inst6_g1.ads, gnat.dg/generic_inst6_i1.ads,
gnat.dg/generic_inst6_i2.ads, gnat.dg/generic_inst6_x.ads: New
testcases.
From-SVN: r273275
Diffstat (limited to 'gcc/ada')
-rw-r--r-- | gcc/ada/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/ada/sem_ch12.adb | 30 |
2 files changed, 37 insertions, 3 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index b74910d..c80c9e4 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,13 @@ +2019-07-09 Ed Schonberg <schonberg@adacore.com> + + * sem_ch12.adb (Instantiate_Formal_Package): Handle properly the + case where the actual for a formal package in an instance is the + current instance of an enclosing generic package. + (Check_Formal_Packages): If the formal package declaration is + box-initialized or lacks associations altogether, no internal + instance was created to verify conformance, and there is no + validating package to remove from tree. + 2019-07-09 Yannick Moy <moy@adacore.com> * freeze.adb (Build_Renamed_Body): Do not set body to inline in diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index 0df4d96..9afa095 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -6657,9 +6657,11 @@ package body Sem_Ch12 is Formal_Decl := Parent (Associated_Formal_Package (E)); -- Nothing to check if the formal has a box or an others_clause - -- (necessarily with a box). + -- (necessarily with a box), or no associations altogether - if Box_Present (Formal_Decl) then + if Box_Present (Formal_Decl) + or else No (Generic_Associations (Formal_Decl)) + then null; elsif Nkind (First (Generic_Associations (Formal_Decl))) = @@ -10309,8 +10311,11 @@ package body Sem_Ch12 is begin Analyze (Actual); + -- The actual must be a package instance, or else a current instance + -- such as a parent generic within the body of a generic child. + if not Is_Entity_Name (Actual) - or else Ekind (Entity (Actual)) /= E_Package + or else not Ekind_In (Entity (Actual), E_Package, E_Generic_Package) then Error_Msg_N ("expect package instance to instantiate formal", Actual); @@ -10354,6 +10359,14 @@ package body Sem_Ch12 is then null; + -- If this is the current instance of an enclosing generic, that + -- unit is the generic package we need. + + elsif In_Open_Scopes (Actual_Pack) + and then Ekind (Actual_Pack) = E_Generic_Package + then + null; + else Error_Msg_NE ("actual parameter must be instance of&", Actual, Gen_Parent); @@ -10487,6 +10500,17 @@ package body Sem_Ch12 is Next_Entity (Actual_Ent); end loop; + + -- No conformance to check if the generic has no formal parameters + -- and the formal package has no generic associations. + + if Is_Empty_List (Formals) + and then + (Box_Present (Formal) + or else No (Generic_Associations (Formal))) + then + return Decls; + end if; end; -- If the formal is not declared with a box, reanalyze it as an |