From patchwork Tue Oct 5 09:57:43 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [Ada] Child project extending a child project Date: Mon, 04 Oct 2010 23:57:43 -0000 From: Arnaud Charlet X-Patchwork-Id: 66783 Message-Id: <20101005095743.GA7811@adacore.com> To: gcc-patches@gcc.gnu.org Cc: Vincent Celier Consider the following projects: project A project Ap extends project A project A.B imports project A project Ap.B imports project Ap and extends project A.B Invoking gnatmake on project Ap.B results in an error. This patch ensures that there is no error. The test is to invoke "gnatmake -P ap-b.gpr" Tested on x86_64-pc-linux-gnu, committed on trunk 2010-10-05 Vincent Celier * prj-part.adb (Parse_Simple_Project): When checking if a child project imports its parent project, also look in projects being extended by imported projects. Index: prj-part.adb =================================================================== --- prj-part.adb (revision 164969) +++ prj-part.adb (working copy) @@ -1653,6 +1653,7 @@ package body Prj.Part is Parent_Node : Project_Node_Id := Empty_Node; With_Clause : Project_Node_Id := First_With_Clause_Of (Project, In_Tree); + Imp_Proj_Name : Name_Id; begin -- If there is an extended project, check its name @@ -1666,11 +1667,23 @@ package body Prj.Part is -- If the parent project is not the extended project, -- check each imported project until we find the parent project. + Imported_Loop : while not Parent_Found and then Present (With_Clause) loop Parent_Node := Project_Node_Of (With_Clause, In_Tree); - Parent_Found := Name_Of (Parent_Node, In_Tree) = Parent_Name; + + Extension_Loop : + while Present (Parent_Node) loop + Imp_Proj_Name := Name_Of (Parent_Node, In_Tree); + Parent_Found := Imp_Proj_Name = Parent_Name; + exit Imported_Loop when Parent_Found; + Parent_Node := + Extended_Project_Of + (Project_Declaration_Of (Parent_Node, In_Tree), + In_Tree); + end loop Extension_Loop; + With_Clause := Next_With_Clause_Of (With_Clause, In_Tree); - end loop; + end loop Imported_Loop; if Parent_Found then Set_Parent_Project_Of (Project, In_Tree, To => Parent_Node);