Commit ad974123 by Justin Squirek Committed by Pierre-Marie de Rodat

[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  <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.

From-SVN: r266978
parent 30377799
2018-12-11 Justin Squirek <squirek@adacore.com>
* 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 <kirtchev@adacore.com>
* exp_prag.adb (Expand_Pragma_Initial_Condition): Do not
......
......@@ -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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment