Hi, This patch merges the D front-end implementation with upstream dmd b6a779e49, fixing two segmentation faults. One when encountering an incomplete static if, and another when resolving typeof() expressions whilst gagging is on.
Bootstrapped and regression tested on x86_64-linux-gnu, committed to mainline, and backported to the release/gcc-10 branch. Regards Iain. --- gcc/d/ChangeLog: PR d/97842 * dmd/MERGE: Merge upstream dmd b6a779e49 --- gcc/d/dmd/MERGE | 2 +- gcc/d/dmd/cond.c | 4 ++ gcc/d/dmd/mtype.c | 6 +++ .../gdc.test/fail_compilation/fail18970.d | 37 +++++++++++++++++++ .../fail_compilation/imports/test21164a.d | 9 +++++ .../fail_compilation/imports/test21164b.d | 4 ++ .../fail_compilation/imports/test21164c.d | 10 +++++ .../fail_compilation/imports/test21164d.d | 9 +++++ .../gdc.test/fail_compilation/test21164.d | 13 +++++++ 9 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gdc.test/fail_compilation/fail18970.d create mode 100644 gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d create mode 100644 gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d create mode 100644 gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d create mode 100644 gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d create mode 100644 gcc/testsuite/gdc.test/fail_compilation/test21164.d diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index e2a0bab2e4a..b00cb8262a7 100644 --- a/gcc/d/dmd/MERGE +++ b/gcc/d/dmd/MERGE @@ -1,4 +1,4 @@ -95044d8e45a4320f07d9c75b4eb30e55688a8195 +b6a779e49a3bba8be6272e6730e14cbb6293ef77 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/cond.c b/gcc/d/dmd/cond.c index beda133ffdb..9f76e83238e 100644 --- a/gcc/d/dmd/cond.c +++ b/gcc/d/dmd/cond.c @@ -705,6 +705,10 @@ int StaticIfCondition::include(Scope *sc) sc = sc->push(sc->scopesym); bool errors = false; + + if (!exp) + goto Lerror; + bool result = evalStaticCondition(sc, exp, exp, errors); sc->pop(); diff --git a/gcc/d/dmd/mtype.c b/gcc/d/dmd/mtype.c index bc66be028c1..6f0195af305 100644 --- a/gcc/d/dmd/mtype.c +++ b/gcc/d/dmd/mtype.c @@ -7418,6 +7418,12 @@ void TypeTypeof::resolve(Loc loc, Scope *sc, Expression **pe, Type **pt, Dsymbol //printf("TypeTypeof::resolve(sc = %p, idents = '%s')\n", sc, toChars()); //static int nest; if (++nest == 50) *(char*)0=0; + if (sc == NULL) + { + *pt = Type::terror; + error(loc, "Invalid scope."); + return; + } if (inuse) { inuse = 2; diff --git a/gcc/testsuite/gdc.test/fail_compilation/fail18970.d b/gcc/testsuite/gdc.test/fail_compilation/fail18970.d new file mode 100644 index 00000000000..846a5782d7d --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/fail18970.d @@ -0,0 +1,37 @@ +/* +TEST_OUTPUT: +--- +fail_compilation/fail18970.d(22): Error: no property `y` for type `fail18970.S` +fail_compilation/fail18970.d(29): Error: no property `yyy` for type `fail18970.S2` +--- +*/ + +// https://issues.dlang.org/show_bug.cgi?id=18970 + +struct S +{ + auto opDispatch(string name)(int) + { + alias T = typeof(x); + static assert(!is(T.U)); + return 0; + } +} +void f() +{ + S().y(1); +} + +struct S2 +{ + this(int) + { + this.yyy; + } + + auto opDispatch(string name)() + { + alias T = typeof(x); + static if(is(T.U)) {} + } +} diff --git a/gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d new file mode 100644 index 00000000000..e5fcd43595e --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d @@ -0,0 +1,9 @@ +struct D(E) +{ + void G() { + import imports.test21164d; + I; + } + +} + diff --git a/gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d new file mode 100644 index 00000000000..ece5476654e --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d @@ -0,0 +1,4 @@ +import imports.test21164c; +enum N = O(); +alias Q = R!(N, S); + diff --git a/gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d new file mode 100644 index 00000000000..21a252f5036 --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d @@ -0,0 +1,10 @@ +enum S = 1; + +struct O +{ +} + +struct R(O U, int W) +{ +} + diff --git a/gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d new file mode 100644 index 00000000000..08f83ea91f7 --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d @@ -0,0 +1,9 @@ +auto AB() +{ +static if} + +auto I() +{ +AB; +} + diff --git a/gcc/testsuite/gdc.test/fail_compilation/test21164.d b/gcc/testsuite/gdc.test/fail_compilation/test21164.d new file mode 100644 index 00000000000..f42c4bc9d15 --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/test21164.d @@ -0,0 +1,13 @@ +/* +TEST_OUTPUT: +--- +fail_compilation/imports/test21164d.d(3): Error: (expression) expected following `static if` +fail_compilation/imports/test21164d.d(3): Error: found `}` instead of statement +fail_compilation/test21164.d(11): Error: template instance `test21164a.D!(R!(O(), 1))` error instantiating +--- +*/ +import imports.test21164a; +import imports.test21164b; +auto GB(D!Q) +{ +} -- 2.27.0