]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
d: Merge upstream dmd 88de5e369.
authorIain Buclaw <ibuclaw@gdcproject.org>
Thu, 5 May 2022 19:00:36 +0000 (21:00 +0200)
committerIain Buclaw <ibuclaw@gdcproject.org>
Thu, 5 May 2022 19:00:36 +0000 (21:00 +0200)
D front-end changes:

    - Merge regression fixes in v2.100.0 branch.

gcc/d/ChangeLog:

* dmd/MERGE: Merge upstream dmd 88de5e369.

gcc/d/dmd/MERGE
gcc/d/dmd/traits.d
gcc/d/dmd/typesem.d
gcc/testsuite/gdc.test/compilable/test23087.d [new file with mode: 0644]
gcc/testsuite/gdc.test/compilable/test23089.d [new file with mode: 0644]
gcc/testsuite/gdc.test/runnable/test23083.d [new file with mode: 0644]

index 984e375479bafb781d084564d7f174600fd5bc88..73697fba8e61c60db976ba5222f2c267bd8e3ee5 100644 (file)
@@ -1,4 +1,4 @@
-081d61e157f0064dc93c757d61cd998d3cb5288f
+88de5e369b2c322e55174ae4f3bef5ad0c0c0930
 
 The first line of this file holds the git revision number of the last
 merge done from the dlang/dmd repository.
index 04e1c47d16e944c8f1a5ab26f041dc4618a54d49..db77107e4ae427bd85aeb00f7db1017090e84e84 100644 (file)
@@ -1515,7 +1515,7 @@ Expression semanticTraits(TraitsExp e, Scope* sc)
 
         if (tf)
         {
-            link = fd ? fd.linkage : tf.linkage;
+            link = fd ? fd.toAliasFunc().linkage : tf.linkage;
         }
         else
         {
index f63b17752edd932ebdc0e2fcb19116a6ff639acc..5db7d43371ea3df7688e5caf3fee141d9858e3ca 100644 (file)
@@ -3637,12 +3637,16 @@ Expression dotExp(Type mt, Scope* sc, Expression e, Identifier ident, int flag)
             }
             else
             {
+                Expression e0;
+                Expression ev = e;
+                ev = extractSideEffect(sc, "__tup", e0, ev);
+
                 const length = cast(size_t)mt.dim.toUInteger();
                 auto exps = new Expressions();
                 exps.reserve(length);
                 foreach (i; 0 .. length)
-                    exps.push(new IndexExp(e.loc, e, new IntegerExp(e.loc, i, Type.tsize_t)));
-                e = new TupleExp(e.loc, exps);
+                    exps.push(new IndexExp(e.loc, ev, new IntegerExp(e.loc, i, Type.tsize_t)));
+                e = new TupleExp(e.loc, e0, exps);
             }
         }
         else
diff --git a/gcc/testsuite/gdc.test/compilable/test23087.d b/gcc/testsuite/gdc.test/compilable/test23087.d
new file mode 100644 (file)
index 0000000..6927ddf
--- /dev/null
@@ -0,0 +1,9 @@
+// https://issues.dlang.org/show_bug.cgi?id=23087
+struct S
+{
+    this(bool) {}
+    this(bool, int) {}
+}
+
+static foreach (ctor; __traits(getOverloads, S, "__ctor"))
+    static assert(__traits(getLinkage, ctor) == "D");
diff --git a/gcc/testsuite/gdc.test/compilable/test23089.d b/gcc/testsuite/gdc.test/compilable/test23089.d
new file mode 100644 (file)
index 0000000..1bc2913
--- /dev/null
@@ -0,0 +1,7 @@
+// https://issues.dlang.org/show_bug.cgi?id=23089
+extern(System) int i23089;
+
+extern(System):
+
+alias F23089 = void function(int);
+F23089 f23089;
diff --git a/gcc/testsuite/gdc.test/runnable/test23083.d b/gcc/testsuite/gdc.test/runnable/test23083.d
new file mode 100644 (file)
index 0000000..41c881f
--- /dev/null
@@ -0,0 +1,16 @@
+// https://issues.dlang.org/show_bug.cgi?id=23083
+int calls = 0;
+
+int[2] f()
+{
+    calls++;
+    return [123, 456];
+}
+
+void g(int a, int b) {}
+
+void main()
+{
+    g(f().tupleof);
+    assert(calls == 1);
+}