summaryrefslogtreecommitdiff
path: root/gcc/ada/lib-load.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/lib-load.adb')
-rw-r--r--gcc/ada/lib-load.adb39
1 files changed, 20 insertions, 19 deletions
diff --git a/gcc/ada/lib-load.adb b/gcc/ada/lib-load.adb
index a4fb2085514..98f9a52b242 100644
--- a/gcc/ada/lib-load.adb
+++ b/gcc/ada/lib-load.adb
@@ -52,7 +52,7 @@ package body Lib.Load is
-- Local Subprograms --
-----------------------
- function From_Limited_With_Chain (Lim : Boolean) return Boolean;
+ function From_Limited_With_Chain return Boolean;
-- Check whether a possible circular dependence includes units that
-- have been loaded through limited_with clauses, in which case there
-- is no real circularity.
@@ -236,22 +236,24 @@ package body Lib.Load is
-- From_Limited_With_Chain --
-----------------------------
- function From_Limited_With_Chain (Lim : Boolean) return Boolean is
+ function From_Limited_With_Chain return Boolean is
+ Curr_Num : constant Unit_Number_Type :=
+ Load_Stack.Table (Load_Stack.Last).Unit_Number;
+
begin
-- True if the current load operation is through a limited_with clause
+ -- and we are not within a loop of regular with_clauses.
- if Lim then
- return True;
-
- -- Examine the Load_Stack to locate any previous Limited_with clause
+ for U in reverse Load_Stack.First .. Load_Stack.Last - 1 loop
+ if Load_Stack.Table (U).Unit_Number = Curr_Num then
+ return False;
- elsif Load_Stack.Last - 1 > Load_Stack.First then
- for U in Load_Stack.First .. Load_Stack.Last - 1 loop
- if Load_Stack.Table (U).From_Limited_With then
- return True;
- end if;
- end loop;
- end if;
+ elsif Present (Load_Stack.Table (U).With_Node)
+ and then Limited_Present (Load_Stack.Table (U).With_Node)
+ then
+ return True;
+ end if;
+ end loop;
return False;
end From_Limited_With_Chain;
@@ -285,7 +287,7 @@ package body Lib.Load is
begin
Load_Stack.Increment_Last;
- Load_Stack.Table (Load_Stack.Last) := (Main_Unit, False);
+ Load_Stack.Table (Load_Stack.Last) := (Main_Unit, Empty);
-- Initialize unit table entry for Main_Unit. Note that we don't know
-- the unit name yet, that gets filled in when the parser parses the
@@ -339,7 +341,7 @@ package body Lib.Load is
Subunit : Boolean;
Corr_Body : Unit_Number_Type := No_Unit;
Renamings : Boolean := False;
- From_Limited_With : Boolean := False) return Unit_Number_Type
+ With_Node : Node_Id := Empty) return Unit_Number_Type
is
Calling_Unit : Unit_Number_Type;
Uname_Actual : Unit_Name_Type;
@@ -558,7 +560,7 @@ package body Lib.Load is
-- and indicate the kind of with_clause responsible for the load.
Load_Stack.Increment_Last;
- Load_Stack.Table (Load_Stack.Last) := (Unum, From_Limited_With);
+ Load_Stack.Table (Load_Stack.Last) := (Unum, With_Node);
-- Case of entry already in table
@@ -579,7 +581,7 @@ package body Lib.Load is
or else Acts_As_Spec (Units.Table (Unum).Cunit))
and then (Nkind (Error_Node) /= N_With_Clause
or else not Limited_Present (Error_Node))
- and then not From_Limited_With_Chain (From_Limited_With)
+ and then not From_Limited_With_Chain
then
if Debug_Flag_L then
Write_Str (" circular dependency encountered");
@@ -653,8 +655,7 @@ package body Lib.Load is
Multiple_Unit_Index := Get_Unit_Index (Uname_Actual);
Units.Table (Unum).Munit_Index := Multiple_Unit_Index;
Initialize_Scanner (Unum, Source_Index (Unum));
- Discard_List (Par (Configuration_Pragmas => False,
- From_Limited_With => From_Limited_With));
+ Discard_List (Par (Configuration_Pragmas => False));
Multiple_Unit_Index := Save_Index;
Set_Loading (Unum, False);
end;