Commit 3bd6c100 by Ed Schonberg Committed by Geert Bosch

* sem_ch12.adb:

	(Analyze_generic_subprogram_Declaration): Set outer_generic_scope,
	to prevent freezing within formal packages.
	(Freeze_Subprogram_Body): If body comes from another instance that
	appeared before its own body, place freeze node at end of current
	declarative part, to prevent a back-end crash.
	(Inline_Instance_Body): Handle properly a package instance within
	a subprogram instance that is a child unit.

From-SVN: r47555
parent 52acbdcb
2001-12-03 Ed Schonberg <schonber@gnat.com>
* sem_ch12.adb:
(Analyze_generic_subprogram_Declaration): Set outer_generic_scope,
to prevent freezing within formal packages.
(Freeze_Subprogram_Body): If body comes from another instance that
appeared before its own body, place freeze node at end of current
declarative part, to prevent a back-end crash.
(Inline_Instance_Body): Handle properly a package instance within
a subprogram instance that is a child unit.
2001-12-01 Graham Stott <grahams@redhat.com> 2001-12-01 Graham Stott <grahams@redhat.com>
* Makefile.in (misc.o): Add missing $(srcdir) prefix * Makefile.in (misc.o): Add missing $(srcdir) prefix
......
...@@ -2061,7 +2061,9 @@ package body Sem_Ch12 is ...@@ -2061,7 +2061,9 @@ package body Sem_Ch12 is
Enter_Name (Id); Enter_Name (Id);
Set_Scope_Depth_Value (Id, Scope_Depth (Current_Scope) + 1);
New_Scope (Id); New_Scope (Id);
Enter_Generic_Scope (Id);
Set_Inner_Instances (Id, New_Elmt_List); Set_Inner_Instances (Id, New_Elmt_List);
Set_Is_Pure (Id, Is_Pure (Current_Scope)); Set_Is_Pure (Id, Is_Pure (Current_Scope));
...@@ -2099,6 +2101,7 @@ package body Sem_Ch12 is ...@@ -2099,6 +2101,7 @@ package body Sem_Ch12 is
End_Generic; End_Generic;
End_Scope; End_Scope;
Exit_Generic_Scope (Id);
end Analyze_Generic_Subprogram_Declaration; end Analyze_Generic_Subprogram_Declaration;
...@@ -2715,7 +2718,9 @@ package body Sem_Ch12 is ...@@ -2715,7 +2718,9 @@ package body Sem_Ch12 is
and then S /= Standard_Standard and then S /= Standard_Standard
loop loop
exit when Is_Generic_Instance (S) exit when Is_Generic_Instance (S)
and then In_Package_Body (S); and then (In_Package_Body (S)
or else Ekind (S) = E_Procedure
or else Ekind (S) = E_Function);
if S = Curr_Unit if S = Curr_Unit
or else (Ekind (Curr_Unit) = E_Package_Body or else (Ekind (Curr_Unit) = E_Package_Body
...@@ -2725,7 +2730,7 @@ package body Sem_Ch12 is ...@@ -2725,7 +2730,7 @@ package body Sem_Ch12 is
if Is_Child_Unit (S) then if Is_Child_Unit (S) then
-- Remove child unit from stack, as well as inner scopes. -- Remove child unit from stack, as well as inner scopes.
-- Removing its context of child unit will remove parent -- Removing the context of a child unit removes parent
-- units as well. -- units as well.
while Current_Scope /= S loop while Current_Scope /= S loop
...@@ -5020,7 +5025,15 @@ package body Sem_Ch12 is ...@@ -5020,7 +5025,15 @@ package body Sem_Ch12 is
and then and then
In_Same_Declarative_Part (Freeze_Node (Par), Inst_Node) In_Same_Declarative_Part (Freeze_Node (Par), Inst_Node)
then then
if ABE_Is_Certain (Get_Package_Instantiation_Node (Par)) then
-- The parent was a premature instantiation. Insert freeze
-- node at the end the current declarative part.
Insert_After_Last_Decl (Inst_Node, F_Node);
else
Insert_After (Freeze_Node (Par), F_Node); Insert_After (Freeze_Node (Par), F_Node);
end if;
-- The body enclosing the instance should be frozen after the body -- The body enclosing the instance should be frozen after the body
-- that includes the generic, because the body of the instance may -- that includes the generic, because the body of the instance may
......
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