diff mbox series

[Ada] Spurious 'W' ALI line due to implicit with clause

Message ID 20171215141059.GA97848@adacore.com
State New
Headers show
Series [Ada] Spurious 'W' ALI line due to implicit with clause | expand

Commit Message

Pierre-Marie de Rodat Dec. 15, 2017, 2:10 p.m. UTC
This patch "fixes" an issue where an implicit with clause generated to emulate
an implicit Elaborate[_All] pragma appears on a 'W' line in the ALI file. As a
result, the 'W' line may introduce a spurious build dependency in GPRbuild.

------------
-- Source --
------------

--  func.ads

function Func return Boolean;

--  func.adb

function Func return Boolean is begin return True; end Func;

--  gen.ads

generic
package Gen is
   procedure Force_Body;
end Gen;

--  gen.adb

with Func;

package body Gen is
   Val : constant Boolean := Func;

   procedure Force_Body is begin null; end Force_Body;
end Gen;

--  pack.ads

with Gen;

package Pack is
   package Inst is new Gen;
end Pack;

--  main.adb

with Pack;

procedure Main is begin null; end Main;

----------------------------
-- Compilation and output --
----------------------------

$ gnatmake -q main.adb
$ grep -c "Z func" pack.ali
1

Tested on x86_64-pc-linux-gnu, committed on trunk

2017-12-15  Hristian Kirtchev  <kirtchev@adacore.com>

	* sem_elab.adb (Ensure_Prior_Elaboration_Static): Mark the generated
	with clause as being implicit for an instantiation in order to
	circumvent an issue with 'W' and 'Z' line encodings in ALI files.
diff mbox series

Patch

Index: sem_elab.adb
===================================================================
--- sem_elab.adb	(revision 255683)
+++ sem_elab.adb	(working copy)
@@ -3585,6 +3585,16 @@ 
          Set_Implicit_With (Clause);
          Set_Library_Unit  (Clause, Unit_Cunit);
 
+         --  The following is a kludge to satisfy a GPRbuild requirement. In
+         --  general, internal with clauses should be encoded on a 'Z' line in
+         --  ALI files, but due to an old bug, they are encoded as source with
+         --  clauses on a 'W' line. As a result, these "semi-implicit" clauses
+         --  introduce spurious build dependencies in GPRbuild. The only way to
+         --  eliminate this effect is to mark the implicit clauses as generated
+         --  for an instantiation.
+
+         Set_Implicit_With_From_Instantiation (Clause);
+
          Append_To (Items, Clause);
       end if;