Commit b53c1b9c by Arnaud Charlet

[multiple changes]

2010-06-17  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch12.adb (Mark_Context): Refine placement of Withed_Body flag, so
	that it marks a unit as needed by a spec only if the corresponding
	instantiation appears in that spec (and not in the corresponding body).
	* sem_elim.adb (Check_Eliminated): If we are within a subunit, the name
	in the pragma Eliminate has been parsed as a child unit, but the
	current compilation unit is in fact the parent in which the subunit is
	embedded.

2010-06-17  Vincent Celier  <celier@adacore.com>

	* gnat_rm.texi: Fix typo

From-SVN: r160928
parent 7a78fa97
2010-06-17 Ed Schonberg <schonberg@adacore.com>
* sem_ch12.adb (Mark_Context): Refine placement of Withed_Body flag, so
that it marks a unit as needed by a spec only if the corresponding
instantiation appears in that spec (and not in the corresponding body).
* sem_elim.adb (Check_Eliminated): If we are within a subunit, the name
in the pragma Eliminate has been parsed as a child unit, but the
current compilation unit is in fact the parent in which the subunit is
embedded.
2010-06-17 Vincent Celier <celier@adacore.com>
* gnat_rm.texi: Fix typo
2010-06-17 Robert Dewar <dewar@adacore.com> 2010-06-17 Robert Dewar <dewar@adacore.com>
* sem_util.adb: Minor reformatting * sem_util.adb: Minor reformatting
......
...@@ -16271,7 +16271,7 @@ be copied. The directory must exist, must be distinct from the project's ...@@ -16271,7 +16271,7 @@ be copied. The directory must exist, must be distinct from the project's
object directory and source directories of all projects in the project tree, object directory and source directories of all projects in the project tree,
and must be writable. and must be writable.
@item Library_Src_Dir @item Library_ALI_Dir
Expression must be a path name. The attribute defines the Expression must be a path name. The attribute defines the
directory in which the ALI files of a Library will directory in which the ALI files of a Library will
be copied. The directory must exist, must be distinct from the project's be copied. The directory must exist, must be distinct from the project's
......
...@@ -10388,11 +10388,16 @@ package body Sem_Ch12 is ...@@ -10388,11 +10388,16 @@ package body Sem_Ch12 is
------------------ ------------------
procedure Mark_Context (Inst_Decl : Node_Id; Gen_Decl : Node_Id) is procedure Mark_Context (Inst_Decl : Node_Id; Gen_Decl : Node_Id) is
Inst_CU : constant Unit_Number_Type := Get_Source_Unit (Inst_Decl); Inst_CU : constant Unit_Number_Type := Get_Code_Unit (Inst_Decl);
Gen_CU : constant Unit_Number_Type := Get_Source_Unit (Gen_Decl); Gen_CU : constant Unit_Number_Type := Get_Source_Unit (Gen_Decl);
Clause : Node_Id; Clause : Node_Id;
begin begin
-- Note that we use Get_Code_Unit to determine the position of the
-- instantiation, because it may itself appear within another instance
-- and we need to mark the context of the enclosing unit, not that of
-- the unit that contains the corresponding generic.
Clause := First (Context_Items (Cunit (Inst_CU))); Clause := First (Context_Items (Cunit (Inst_CU)));
while Present (Clause) loop while Present (Clause) loop
if Nkind (Clause) = N_With_Clause if Nkind (Clause) = N_With_Clause
...@@ -10403,27 +10408,6 @@ package body Sem_Ch12 is ...@@ -10403,27 +10408,6 @@ package body Sem_Ch12 is
Next (Clause); Next (Clause);
end loop; end loop;
-- If the instance appears within another instantiated unit, check
-- whether it appears in the main unit, and indicate the need for
-- the body of the enclosing instance as well.
if In_Extended_Main_Code_Unit (Inst_Decl)
and then Instantiation_Location (Sloc (Inst_Decl)) /= No_Location
and then Present (Library_Unit (Cunit (Main_Unit)))
and then Cunit (Inst_CU) /= Library_Unit (Cunit (Main_Unit))
then
Clause := First (Context_Items (Library_Unit (Cunit (Main_Unit))));
while Present (Clause) loop
if Nkind (Clause) = N_With_Clause
and then Library_Unit (Clause) = Cunit (Gen_CU)
then
Set_Withed_Body (Clause, Cunit (Gen_CU));
end if;
Next (Clause);
end loop;
end if;
end Mark_Context; end Mark_Context;
--------------------- ---------------------
......
...@@ -234,6 +234,7 @@ package body Sem_Elim is ...@@ -234,6 +234,7 @@ package body Sem_Elim is
Elmt : Access_Elim_Data; Elmt : Access_Elim_Data;
Scop : Entity_Id; Scop : Entity_Id;
Form : Entity_Id; Form : Entity_Id;
Up : Nat;
begin begin
if No_Elimination then if No_Elimination then
...@@ -292,7 +293,37 @@ package body Sem_Elim is ...@@ -292,7 +293,37 @@ package body Sem_Elim is
-- Now see if compilation unit matches -- Now see if compilation unit matches
for J in reverse Elmt.Unit_Name'Range loop Up := Elmt.Unit_Name'Last;
-- If we are within a subunit, the name in the pragma has been
-- parsed as a child unit, but the current compilation unit is
-- in fact the parent in which the subunit is embedded. We must
-- skip the first name which is that of the subunit to match
-- the pragma specification.
declare
Par : Node_Id;
begin
Par := Parent (E);
while Present (Par) loop
if Nkind (Par) = N_Subunit then
if Chars (Defining_Unit_Name (Proper_Body (Par))) =
Elmt.Unit_Name (Up)
then
Up := Up - 1;
exit;
else
goto Continue;
end if;
end if;
Par := Parent (Par);
end loop;
end;
for J in reverse Elmt.Unit_Name'First .. Up loop
if Elmt.Unit_Name (J) /= Chars (Scop) then if Elmt.Unit_Name (J) /= Chars (Scop) then
goto Continue; goto Continue;
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