[Ada] GNATmake fails to detect missing body
authorJustin Squirek <squirek@adacore.com>
Tue, 31 Jul 2018 09:56:15 +0000 (09:56 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 31 Jul 2018 09:56:15 +0000 (09:56 +0000)
This patch corrects an issue whereby building a multi-unit compilation with
missing sources resulted in a cryptic "code generation" error instead of the
appropriate file not found error.

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

--  main.adb

with Types;
procedure Main is
begin
   null;
end;

--  types.ads

package Types is
  procedure Force;
end;

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

& gnatmake -q main.adb
gnatmake: "types.adb" not found

2018-07-31  Justin Squirek  <squirek@adacore.com>

gcc/ada/

* lib-writ.adb (Write_With_Lines): Modfiy the generation of
dependencies within ali files so that source unit bodies are
properly listed even if said bodies are missing.  Perform legacy
behavior in GNATprove mode.
* lib-writ.ads: Modify documentation to reflect current behavior.

From-SVN: r263100

gcc/ada/ChangeLog
gcc/ada/lib-writ.adb
gcc/ada/lib-writ.ads

index eab50c1e15598dbcb021c510f85e636fbea31f3a..ccb8aa428af51db1c1fe01bf1250b6f571e11750 100644 (file)
@@ -1,3 +1,11 @@
+2018-07-31  Justin Squirek  <squirek@adacore.com>
+
+       * lib-writ.adb (Write_With_Lines): Modfiy the generation of
+       dependencies within ali files so that source unit bodies are
+       properly listed even if said bodies are missing.  Perform legacy
+       behavior in GNATprove mode.
+       * lib-writ.ads: Modify documentation to reflect current behavior.
+
 2018-07-31  Eric Botcazou  <ebotcazou@adacore.com>
 
        *  libgnarl/s-osinte__solaris.ads (upad64_t): New private type.
index 3598311354abe787ca938817bb1811a5bdad4fa8..9a54fa9dbcd9a6626d30fc429b2099f20bc18e2d 100644 (file)
@@ -950,20 +950,35 @@ package body Lib.Writ is
                Write_Info_Tab (25);
 
                if Is_Spec_Name (Uname) then
-                  Body_Fname :=
-                    Get_File_Name
-                      (Get_Body_Name (Uname),
-                       Subunit => False, May_Fail => True);
-
-                  Body_Index :=
-                    Get_Unit_Index
-                      (Get_Body_Name (Uname));
-
-                  if Body_Fname = No_File then
-                     Body_Fname := Get_File_Name (Uname, Subunit => False);
-                     Body_Index := Get_Unit_Index (Uname);
-                  end if;
 
+                  --  In GNATprove mode we must write the spec of a unit which
+                  --  requires a body if that body is not found. This will
+                  --  allow partial analysis on incomplete sources.
+
+                  if GNATprove_Mode then
+
+                     Body_Fname :=
+                       Get_File_Name (Get_Body_Name (Uname),
+                                       Subunit => False, May_Fail => True);
+
+                     Body_Index := Get_Unit_Index (Get_Body_Name (Uname));
+
+                     if Body_Fname = No_File then
+                        Body_Fname := Get_File_Name (Uname, Subunit => False);
+                        Body_Index := Get_Unit_Index (Uname);
+                     end if;
+
+                  --  In the normal path we don't allow failure in fetching the
+                  --  name of the desired body unit so that it may be properly
+                  --  referenced in the output ali - even if it is missing.
+
+                  else
+                     Body_Fname :=
+                       Get_File_Name (Get_Body_Name (Uname),
+                                       Subunit => False, May_Fail => False);
+
+                     Body_Index := Get_Unit_Index (Get_Body_Name (Uname));
+                  end if;
                else
                   Body_Fname := Get_File_Name (Uname, Subunit => False);
                   Body_Index := Get_Unit_Index (Uname);
index 5b79c43b63983b7148b4829fefa239a6b38020cd..df391a8cc9966bf2319004736e34962f3bc9c699 100644 (file)
@@ -629,13 +629,13 @@ package Lib.Writ is
    --      by the current unit. One Z line is present for each unit that is
    --      only implicitly withed by the current unit. The first parameter is
    --      the unit name in internal format. The second parameter is the file
-   --      name of the file that must be compiled to compile this unit. It is
-   --      usually the file for the body, except for packages which have no
-   --      body. For units that need a body, if the source file for the body
-   --      cannot be found, the file name of the spec is used instead. The
-   --      third parameter is the file name of the library information file
-   --      that contains the results of compiling this unit. The optional
-   --      modifiers are used as follows:
+   --      name of the body unit on which the current compliation depends -
+   --      except when in GNATprove mode. In GNATprove mode, when packages
+   --      which require a body have no associated source file, the file name
+   --      of the spec is used instead to allow partial analysis of incomplete
+   --      sources. The third parameter is the file name of the library
+   --      information file that contains the results of compiling this unit.
+   --      The optional modifiers are used as follows:
 
    --        E   pragma Elaborate applies to this unit