diff options
Diffstat (limited to 'gcc/ada/inline.adb')
-rw-r--r-- | gcc/ada/inline.adb | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/gcc/ada/inline.adb b/gcc/ada/inline.adb index f39bbbaf344..c9b43ba187c 100644 --- a/gcc/ada/inline.adb +++ b/gcc/ada/inline.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2006, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2007, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -33,6 +33,7 @@ with Exp_Tss; use Exp_Tss; with Fname; use Fname; with Fname.UF; use Fname.UF; with Lib; use Lib; +with Namet; use Namet; with Nlists; use Nlists; with Opt; use Opt; with Sem_Ch8; use Sem_Ch8; @@ -246,12 +247,24 @@ package body Inline is ----------------- function Must_Inline return Boolean is - Scop : Entity_Id := Current_Scope; + Scop : Entity_Id; Comp : Node_Id; begin -- Check if call is in main unit + Scop := Current_Scope; + + -- Do not try to inline if scope is standard. This could happen, for + -- example, for a call to Add_Global_Declaration, and it causes + -- trouble to try to inline at this level. + + if Scop = Standard_Standard then + return False; + end if; + + -- Otherwise lookup scope stack to outer scope + while Scope (Scop) /= Standard_Standard and then not Is_Child_Unit (Scop) loop @@ -259,7 +272,6 @@ package body Inline is end loop; Comp := Parent (Scop); - while Nkind (Comp) /= N_Compilation_Unit loop Comp := Parent (Comp); end loop; @@ -271,8 +283,7 @@ package body Inline is return True; end if; - -- Call is not in main unit. See if it's in some inlined - -- subprogram. + -- Call is not in main unit. See if it's in some inlined subprogram Scop := Current_Scope; while Scope (Scop) /= Standard_Standard @@ -289,7 +300,6 @@ package body Inline is end loop; return False; - end Must_Inline; -- Start of processing for Add_Inlined_Body @@ -563,7 +573,7 @@ package body Inline is Analyzing_Inlined_Bodies := False; if Serious_Errors_Detected = 0 then - New_Scope (Standard_Standard); + Push_Scope (Standard_Standard); J := 0; while J <= Inlined_Bodies.Last @@ -609,7 +619,7 @@ package body Inline is Error_Msg_N ("one or more inlined subprograms accessed in $!", Comp_Unit); - Error_Msg_Name_1 := + Error_Msg_File_1 := Get_File_Name (Bname, Subunit => False); Error_Msg_N ("\but file{ was not found!", Comp_Unit); raise Unrecoverable_Error; @@ -860,7 +870,7 @@ package body Inline is end if; end if; - New_Scope (Scop); + Push_Scope (Scop); Expand_Cleanup_Actions (Decl); End_Scope; @@ -935,7 +945,7 @@ package body Inline is if Serious_Errors_Detected = 0 then Expander_Active := (Operating_Mode = Opt.Generate_Code); - New_Scope (Standard_Standard); + Push_Scope (Standard_Standard); To_Clean := New_Elmt_List; if Is_Generic_Unit (Cunit_Entity (Main_Unit)) then |