From: pmderodat Date: Tue, 11 Dec 2018 11:09:08 +0000 (+0000) Subject: [Ada] Crash on nesting of subunits with bodies acting as specs X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=236d875af89206f148036e349c92552621549c1b;p=thirdparty%2Fgcc.git [Ada] Crash on nesting of subunits with bodies acting as specs This patch corrects an issue whereby a set of nested subunits including subprogram subunits acting as bodies would cause a crash when a child subunit "withs" an ansestor in certain instances due to a mismanagment of the scope stack. ------------ -- Source -- ------------ -- w.ads package W is end; -- w-b.ads package W.B is pragma Elaborate_Body; end; -- w-b.adb with W.B.C; package body w.B is end; -- w-b-c.adb with W; procedure W.B.C is package D is procedure E; end; package body D is separate; begin null; end; -- w-b-c-d.adb separate (W.B.C) package body D is procedure E is separate; end; -- w-b-c-d-e.adb with W; separate (W.B.C.D) procedure E is begin null; end; ----------------- -- Compilation -- ----------------- $ gnatmake -q w-b.adb 2018-12-11 Justin Squirek gcc/ada/ * sem_ch10.adb (Analyze_Subunit): Modify conditional to fully remove parent contexts from library-level subprogram bodies in addition to package bodies. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@266978 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 9ed28c45c459..b190949b9583 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2018-12-11 Justin Squirek + + * sem_ch10.adb (Analyze_Subunit): Modify conditional to fully + remove parent contexts from library-level subprogram bodies in + addition to package bodies. + 2018-12-11 Hristian Kirtchev * exp_prag.adb (Expand_Pragma_Initial_Condition): Do not diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb index 10e863f91cc9..e540299a6c0a 100644 --- a/gcc/ada/sem_ch10.adb +++ b/gcc/ada/sem_ch10.adb @@ -2352,7 +2352,9 @@ package body Sem_Ch10 is Remove_Scope; end if; - if Nkind (Unit (Lib_Spec)) = N_Package_Body then + if Nkind_In + (Unit (Lib_Spec), N_Package_Body, N_Subprogram_Body) + then Remove_Context (Library_Unit (Lib_Spec)); end if; end if;