Hi, This patch merges the D front-end with upstream dmd 88de5e369, synchronizing the latest regression fixes from the stable v2.100.0 branch that were found in production and industry codebases.
D front-end changes: - Merge regression fixes in v2.100.0 branch. Bootstrapped and regression tested on x86_64-linux-gnu/-m32/-mx32, and committed to the releases/gcc-12 branch. Regards, Iain. --- gcc/d/ChangeLog: * dmd/MERGE: Merge upstream dmd 88de5e369. --- gcc/d/dmd/MERGE | 2 +- gcc/d/dmd/traits.d | 2 +- gcc/d/dmd/typesem.d | 8 ++++++-- gcc/testsuite/gdc.test/compilable/test23087.d | 9 +++++++++ gcc/testsuite/gdc.test/compilable/test23089.d | 7 +++++++ gcc/testsuite/gdc.test/runnable/test23083.d | 16 ++++++++++++++++ 6 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gdc.test/compilable/test23087.d create mode 100644 gcc/testsuite/gdc.test/compilable/test23089.d create mode 100644 gcc/testsuite/gdc.test/runnable/test23083.d diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index 984e375479b..73697fba8e6 100644 --- a/gcc/d/dmd/MERGE +++ b/gcc/d/dmd/MERGE @@ -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. diff --git a/gcc/d/dmd/traits.d b/gcc/d/dmd/traits.d index 04e1c47d16e..db77107e4ae 100644 --- a/gcc/d/dmd/traits.d +++ b/gcc/d/dmd/traits.d @@ -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 { diff --git a/gcc/d/dmd/typesem.d b/gcc/d/dmd/typesem.d index f63b17752ed..5db7d43371e 100644 --- a/gcc/d/dmd/typesem.d +++ b/gcc/d/dmd/typesem.d @@ -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 index 00000000000..6927ddf04df --- /dev/null +++ b/gcc/testsuite/gdc.test/compilable/test23087.d @@ -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 index 00000000000..1bc29138573 --- /dev/null +++ b/gcc/testsuite/gdc.test/compilable/test23089.d @@ -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 index 00000000000..41c881f30a5 --- /dev/null +++ b/gcc/testsuite/gdc.test/runnable/test23083.d @@ -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); +} -- 2.34.1