diff options
Diffstat (limited to 'gcc/ada/lib-load.adb')
-rw-r--r-- | gcc/ada/lib-load.adb | 39 |
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; |