Hi,

A new field for tracking imported files was added to the front-end, this
makes use of it by writing all such files in the make dependency list,
fixing PR 93038.

Bootstrapped and tested on x86_64-linux-gnu, and committed to trunk.

Regards
Iain.

---
gcc/d/ChangeLog:

2020-03-22  Iain Buclaw  <ibuc...@gdcproject.org>

        PR d/93038
        * d-lang.cc (deps_write): Add content imported files to the make
        dependency list.

gcc/testsuite/ChangeLog:

2020-03-22  Iain Buclaw  <ibuc...@gdcproject.org>

        PR d/93038
        * gdc.dg/fileimports/pr93038.txt: New test.
        * gdc.dg/pr93038.d: New test.

---
 gcc/d/d-lang.cc                              | 52 ++++++++++++--------
 gcc/testsuite/gdc.dg/fileimports/pr93038.txt |  1 +
 gcc/testsuite/gdc.dg/pr93038.d               |  8 +++
 3 files changed, 41 insertions(+), 20 deletions(-)
 create mode 100644 gcc/testsuite/gdc.dg/fileimports/pr93038.txt
 create mode 100644 gcc/testsuite/gdc.dg/pr93038.d

diff --git a/gcc/d/d-lang.cc b/gcc/d/d-lang.cc
index 3f50b5f1104..514799d8e89 100644
--- a/gcc/d/d-lang.cc
+++ b/gcc/d/d-lang.cc
@@ -151,7 +151,8 @@ deps_add_target (const char *target, bool quoted)
 static void
 deps_write (Module *module, OutBuffer *buffer, unsigned colmax = 72)
 {
-  hash_set <const char *> dependencies;
+  hash_set <const char *> seen_modules;
+  vec <const char *> dependencies = vNULL;
 
   Modules modlist;
   modlist.push (module);
@@ -179,38 +180,28 @@ deps_write (Module *module, OutBuffer *buffer, unsigned 
colmax = 72)
   buffer->writestring (":");
   column++;
 
-  /* Write out all make dependencies.  */
+  /* Search all modules for file dependencies.  */
   while (modlist.dim > 0)
     {
       Module *depmod = modlist.pop ();
 
       str = depmod->srcfile->name->str;
-      size = strlen (str);
 
-      /* Skip dependencies that have already been written.  */
-      if (dependencies.add (str))
+      /* Skip modules that have already been looked at.  */
+      if (seen_modules.add (str))
        continue;
 
-      column += size;
-
-      if (colmax && column > colmax)
-       {
-         buffer->writestring (" \\\n ");
-         column = size + 1;
-       }
-      else
-       {
-         buffer->writestring (" ");
-         column++;
-       }
-
-      buffer->writestring (str);
+      dependencies.safe_push (str);
 
       /* Add to list of phony targets if is not being compile.  */
       if (d_option.deps_phony && !depmod->isRoot ())
        phonylist.push (depmod);
 
-      /* Search all imports of the written dependency.  */
+      /* Add imported files to dependency list.  */
+      for (size_t i = 0; i < depmod->contentImportedFiles.dim; i++)
+       dependencies.safe_push (depmod->contentImportedFiles[i]);
+
+      /* Search all imports of the module.  */
       for (size_t i = 0; i < depmod->aimports.dim; i++)
        {
          Module *m = depmod->aimports[i];
@@ -244,6 +235,27 @@ deps_write (Module *module, OutBuffer *buffer, unsigned 
colmax = 72)
        }
     }
 
+  /* Write out all make dependencies.  */
+  for (size_t i = 0; i < dependencies.length (); i++)
+    {
+      str = dependencies[i];
+      size = strlen (str);
+      column += size;
+
+      if (colmax && column > colmax)
+       {
+         buffer->writestring (" \\\n ");
+         column = size + 1;
+       }
+      else
+       {
+         buffer->writestring (" ");
+         column++;
+       }
+
+      buffer->writestring (str);
+    }
+
   buffer->writenl ();
 
   /* Write out all phony targets.  */
diff --git a/gcc/testsuite/gdc.dg/fileimports/pr93038.txt 
b/gcc/testsuite/gdc.dg/fileimports/pr93038.txt
new file mode 100644
index 00000000000..9d1dc810c95
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/fileimports/pr93038.txt
@@ -0,0 +1 @@
+v2.091.0
diff --git a/gcc/testsuite/gdc.dg/pr93038.d b/gcc/testsuite/gdc.dg/pr93038.d
new file mode 100644
index 00000000000..4e09690a473
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr93038.d
@@ -0,0 +1,8 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93038
+// { dg-options "-J $srcdir/gdc.dg/fileimports -MMD" }
+// { dg-do compile }
+// { dg-final { scan-file pr93038.deps "pr93038.o: \[^\n\]*/pr93038.d \[ 
\\\\\n\]*\[^\n\]*/fileimports/pr93038.txt" } }
+// { dg-final { file delete pr93038.deps } }
+module pr93038;
+
+const VERSION = import("pr93038.txt");
-- 
2.20.1

Reply via email to