d/dmd: Merge upstream dmd d1a606599
authorIain Buclaw <ibuclaw@gdcproject.org>
Tue, 17 Mar 2020 18:33:14 +0000 (19:33 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Thu, 19 Mar 2020 17:34:52 +0000 (18:34 +0100)
Fixes long standing regression in the D front-end implemention, and adds
a new field to allow retrieving a list of all content imports from the
code generator.

Reviewed-on: https://github.com/dlang/dmd/pull/10913
     https://github.com/dlang/dmd/pull/10933

gcc/d/dmd/MERGE
gcc/d/dmd/dclass.c
gcc/d/dmd/expressionsem.c
gcc/d/dmd/module.h
gcc/testsuite/gdc.test/compilable/imports/pr9471a.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/imports/pr9471b.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/imports/pr9471c.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/imports/pr9471d.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/pr9471.d [new file with mode: 0644]
gcc/testsuite/gdc.test/runnable/traits.d

index 6cbc4e37819921ffb7277183ffb7254861cebbc6..a421448a2871cc716b80be343aa7a54c935c701b 100644 (file)
@@ -1,4 +1,4 @@
-b061bd744cb4eb94a7118581387d988d4ec25e97
+d1a606599e7c2bea8fda8bf5e3ddceb486ae69ac
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
index bbe2f8a9d72e9fa822e933582e78143394cfea04..4609d6a9f54ddcb351531824e4350fa9d6e5fa93 100644 (file)
@@ -395,7 +395,6 @@ void ClassDeclaration::semantic(Scope *sc)
     }
     else if (symtab && !scx)
     {
-        semanticRun = PASSsemanticdone;
         return;
     }
     semanticRun = PASSsemantic;
index 781bd3ea5fdbaed983f5f01bf80b23054e8fe211..fed36cf9242c179570338a01171d722b75eebf02 100644 (file)
@@ -2370,6 +2370,7 @@ public:
             return setError();
         }
 
+        sc->_module->contentImportedFiles.push(name);
         if (global.params.verbose)
             message("file      %.*s\t(%s)", (int)se->len, (char *)se->string, name);
         if (global.params.moduleDeps != NULL)
index 4a20356db8970c9bc759f4b9a176e7370da89960..f4253d326578db6c567f1160ec2f8dce0e513b0d 100644 (file)
@@ -76,6 +76,7 @@ public:
     unsigned numlines;  // number of lines in source file
     int isDocFile;      // if it is a documentation input file, not D source
     bool isPackageFile; // if it is a package.d
+    Strings contentImportedFiles;  // array of files whose content was imported
     int needmoduleinfo;
 
     int selfimports;            // 0: don't know, 1: does not, 2: does
diff --git a/gcc/testsuite/gdc.test/compilable/imports/pr9471a.d b/gcc/testsuite/gdc.test/compilable/imports/pr9471a.d
new file mode 100644 (file)
index 0000000..79b78e1
--- /dev/null
@@ -0,0 +1,2 @@
+import imports.pr9471c;
+class AggregateDeclaration : ScopeDsymbol { }
diff --git a/gcc/testsuite/gdc.test/compilable/imports/pr9471b.d b/gcc/testsuite/gdc.test/compilable/imports/pr9471b.d
new file mode 100644 (file)
index 0000000..a46a12c
--- /dev/null
@@ -0,0 +1,5 @@
+import imports.pr9471a;
+class ClassDeclaration : AggregateDeclaration
+{
+    void isBaseOf();
+}
diff --git a/gcc/testsuite/gdc.test/compilable/imports/pr9471c.d b/gcc/testsuite/gdc.test/compilable/imports/pr9471c.d
new file mode 100644 (file)
index 0000000..d80a614
--- /dev/null
@@ -0,0 +1,18 @@
+import imports.pr9471b;
+
+struct Array(T)
+{
+    static if (is(typeof(T.opCmp))) { }
+}
+alias ClassDeclarations = Array!ClassDeclaration;
+
+class Dsymbol
+{
+    void addObjcSymbols(ClassDeclarations);
+}
+
+class ScopeDsymbol : Dsymbol
+{
+    import imports.pr9471d;
+    void importScope();
+}
diff --git a/gcc/testsuite/gdc.test/compilable/imports/pr9471d.d b/gcc/testsuite/gdc.test/compilable/imports/pr9471d.d
new file mode 100644 (file)
index 0000000..187b908
--- /dev/null
@@ -0,0 +1 @@
+// Module needs to be imported to trigger bug.
diff --git a/gcc/testsuite/gdc.test/compilable/pr9471.d b/gcc/testsuite/gdc.test/compilable/pr9471.d
new file mode 100644 (file)
index 0000000..37ff32e
--- /dev/null
@@ -0,0 +1,6 @@
+// PERMUTE_ARGS:
+// EXTRA_FILES: imports/pr9471a.d imports/pr9471b.d imports/pr9471c.d imports/pr9471d.d
+import imports.pr9471a;
+import imports.pr9471b;
+
+static assert (__traits(getVirtualIndex, ClassDeclaration.isBaseOf) == 7);
index 6c3bf7859e35f2fe2c93fd1aa796ea6b3ce81425..b73ee01ce425780768712e55572b882660694c40 100644 (file)
@@ -1253,7 +1253,7 @@ struct S10096X
     this(this) {}
     ~this() {}
 
-    string getStr() in(str) out(r; r == str) { return str; }
+    string getStr() in { assert(str); } out(r) { assert(r == str); } body { return str; }
 }
 static assert(
     [__traits(allMembers, S10096X)] ==
@@ -1271,7 +1271,7 @@ class C10096X
     this(int) {}
     ~this() {}
 
-    string getStr() in(str) out(r; r == str) { return str;
+    string getStr() in { assert(str); } out(r) { assert(r == str); } body { return str; }
 }
 static assert(
     [__traits(allMembers, C10096X)] ==