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>
* sem_util.adb: Minor reformatting
......
......@@ -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,
and must be writable.
@item Library_Src_Dir
@item Library_ALI_Dir
Expression must be a path name. The attribute defines the
directory in which the ALI files of a Library will
be copied. The directory must exist, must be distinct from the project's
......
......@@ -10388,11 +10388,16 @@ package body Sem_Ch12 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);
Clause : Node_Id;
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)));
while Present (Clause) loop
if Nkind (Clause) = N_With_Clause
......@@ -10403,27 +10408,6 @@ package body Sem_Ch12 is
Next (Clause);
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;
---------------------
......
......@@ -234,6 +234,7 @@ package body Sem_Elim is
Elmt : Access_Elim_Data;
Scop : Entity_Id;
Form : Entity_Id;
Up : Nat;
begin
if No_Elimination then
......@@ -292,7 +293,37 @@ package body Sem_Elim is
-- 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
goto Continue;
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