From: Ronan Desplanques <desplanq...@adacore.com> Before this patch, External_Initialization looked for files in all directories of the source search path, which led to inconsistencies in some cases. This patch restricts the file lookup so the argument is interpreted as relative to the current source file's directory only.
gcc/ada/ChangeLog: * sem_ch3.adb (Apply_External_Initialization): Restrict File lookup. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/sem_ch3.adb | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 4a3d020330c..f88c5adc929 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -42,6 +42,7 @@ with Exp_Dist; use Exp_Dist; with Exp_Tss; use Exp_Tss; with Exp_Util; use Exp_Util; with Expander; use Expander; +with Fmap; with Freeze; use Freeze; with Ghost; use Ghost; with Itypes; use Itypes; @@ -54,6 +55,7 @@ with Namet; use Namet; with Nlists; use Nlists; with Nmake; use Nmake; with Opt; use Opt; +with Osint; with Restrict; use Restrict; with Rident; use Rident; with Rtsfind; use Rtsfind; @@ -87,6 +89,7 @@ with Sinput.L; with Snames; use Snames; with Stringt; with Strub; use Strub; +with System.OS_Lib; with Targparm; use Targparm; with Tbuild; use Tbuild; with Ttypes; use Ttypes; @@ -3885,6 +3888,7 @@ package body Sem_Ch3 is Expr : N_Subexpr_Id; + Data_Path : File_Name_Type; begin Remove (Specification); @@ -3919,13 +3923,42 @@ package body Sem_Ch3 is return; end if; + declare + S : constant String := Stringt.To_String (Strval (Def)); begin - declare - Name : constant Valid_Name_Id := - Stringt.String_To_Name (Strval (Def)); + if System.OS_Lib.Is_Absolute_Path (S) then + Data_Path := Name_Find (S); + else + declare + Current_File_Name : constant File_Name_Type := + Unit_File_Name (Current_Sem_Unit); + + Current_File_Path : constant File_Name_Type := + Fmap.Mapped_Path_Name (Current_File_Name); + + Current_File_Directory : constant File_Name_Type := + Osint.Get_Directory (Current_File_Path); + + Absolute_Dir : constant String := + System.OS_Lib.Normalize_Pathname + (Get_Name_String (Current_File_Directory), + Resolve_Links => False); + + Data_Path_String : constant String := + Absolute_Dir + & System.OS_Lib.Directory_Separator + & Stringt.To_String (Strval (Def)); + begin + Data_Path := Name_Find (Data_Path_String); + end; + end if; + end; + + begin + declare Source_File_I : constant Source_File_Index := - Sinput.L.Load_Source_File (File_Name_Type (Name)); + Sinput.L.Load_Source_File (Data_Path); begin if Source_File_I <= No_Source_File then Error_Msg_N ("cannot find input file", Specification); -- 2.43.0