This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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

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

2018-12-11  Justin Squirek  <squirek@adacore.com>

gcc/ada/

	* sem_ch10.adb (Analyze_Subunit): Modify conditional to fully
	remove parent contexts from library-level subprogram bodies in
	addition to package bodies.
--- gcc/ada/sem_ch10.adb
+++ 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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]