When the project path specified with environment variables ADA_PROJECT_PATH or GPR_PROJECT_PATH, or with switch -aP includes a directory where one project is found, this project may be used incorrectly when imported instead of the project with a similar name in the directory of the importing project, while a duplicated project name should have been detected.
Tested on x86_64-pc-linux-gnu, committed on trunk 2014-01-24 Vincent Celier <cel...@adacore.com> * prj-env.adb (Find_Project): If cached project path is not in project directory, look in current directory first and use cached project path only if project is not found in project directory.
Index: prj-env.adb =================================================================== --- prj-env.adb (revision 207026) +++ prj-env.adb (working copy) @@ -2229,20 +2229,21 @@ Directory : String; Path : out Namet.Path_Name_Type) is + Result : String_Access; + Has_Dot : Boolean := False; + Key : Name_Id; + File : constant String := Project_File_Name; -- Have to do a copy, in case the parameter is Name_Buffer, which we - -- modify below + -- modify below. - function Try_Path_Name is new Find_Name_In_Path - (Check_Filename => Is_Regular_File); + Cached_Path : Namet.Path_Name_Type; + -- This should be commented rather than making us guess from the name??? + + function Try_Path_Name is new + Find_Name_In_Path (Check_Filename => Is_Regular_File); -- Find a file in the project search path - -- Local Declarations - - Result : String_Access; - Has_Dot : Boolean := False; - Key : Name_Id; - -- Start of processing for Find_Project begin @@ -2259,13 +2260,8 @@ Name_Len := File'Length; Name_Buffer (1 .. Name_Len) := File; Key := Name_Find; - Path := Projects_Paths.Get (Self.Cache, Key); + Cached_Path := Projects_Paths.Get (Self.Cache, Key); - if Path /= No_Path then - Debug_Decrease_Indent; - return; - end if; - -- Check if File contains an extension (a dot before a -- directory separator). If it is the case we do not try project file -- with an added extension as it is not possible to have multiple dots @@ -2283,13 +2279,42 @@ if not Is_Absolute_Path (File) then + -- If we have found project in the cache, check if in the directory + + if Cached_Path /= No_Path then + declare + Cached : constant String := Get_Name_String (Cached_Path); + begin + if (not Has_Dot + and then Cached = + GNAT.OS_Lib.Normalize_Pathname + (File & Project_File_Extension, + Directory => Directory, + Resolve_Links => Opt.Follow_Links_For_Files, + Case_Sensitive => True)) + or else + Cached = + GNAT.OS_Lib.Normalize_Pathname + (File, + Directory => Directory, + Resolve_Links => Opt.Follow_Links_For_Files, + Case_Sensitive => True) + then + Path := Cached_Path; + Debug_Decrease_Indent; + return; + end if; + end; + end if; + -- First we try <directory>/<file_name>.<extension> if not Has_Dot then - Result := Try_Path_Name - (Self, - Directory & Directory_Separator & - File & Project_File_Extension); + Result := + Try_Path_Name + (Self, + Directory & Directory_Separator & + File & Project_File_Extension); end if; -- Then we try <directory>/<file_name> @@ -2300,6 +2325,14 @@ end if; end if; + -- If we found the path in the cache, this is the one + + if Result = null and then Cached_Path /= No_Path then + Path := Cached_Path; + Debug_Decrease_Indent; + return; + end if; + -- Then we try <file_name>.<extension> if Result = null and then not Has_Dot then