This patch fixes a compiler abort on a package instantiation when the corresponding generic has a formal package, and the instantiation has an actual that renames the desired package instance.
The following must compile quietly: gcc -c mc.adb --- package MC is procedure Dump_States; end MC; --- with Configurations; with UCTL; package body MC is package MyConfigurations is new Configurations; package Configurations renames MyConfigurations; package MyUCTL0 is new UCTL(MYConfigurations); package MyUCTL is new UCTL(Configurations); procedure Dump_States is begin MyUCTL.Doit; end Dump_States; begin null; end MC; --- generic package Configurations is procedure Doit; end Configurations; --- package body Configurations is procedure Doit is begin null; end; begin null; end Configurations; --- with Configurations; generic with package MyConfigurations is new Configurations(<>); package UCTL is procedure Doit; end UCTL; --- package body UCTL is procedure Doit is begin MyConfigurations.Doit; end; end; Tested on x86_64-pc-linux-gnu, committed on trunk 2017-09-25 Ed Schonberg <schonb...@adacore.com> * sem_ch12.adb (Analyze_Associations, case N_Formal_Package): If the actual is a renaming, indicate that it is the renamed package that must be frozen before the instantiation.
Index: sem_ch12.adb =================================================================== --- sem_ch12.adb (revision 253135) +++ sem_ch12.adb (working copy) @@ -1980,8 +1980,22 @@ if Needs_Freezing then Check_Generic_Parent; - Set_Has_Delayed_Freeze (Actual); - Append_Elmt (Actual, Actuals_To_Freeze); + + -- If the actual is a renaming of a proper + -- instance of the formal package, indicate + -- that it is the instance that must be frozen. + + if Nkind (Parent (Actual)) = + N_Package_Renaming_Declaration + then + Set_Has_Delayed_Freeze + (Renamed_Entity (Actual)); + Append_Elmt + (Renamed_Entity (Actual), Actuals_To_Freeze); + else + Set_Has_Delayed_Freeze (Actual); + Append_Elmt (Actual, Actuals_To_Freeze); + end if; end if; end if; end Explicit_Freeze_Check;