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 <[email protected]>
* 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.
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;