From 27d8c3516b67c0f5a8fe8970d0558ee3b97e8281 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Tue, 17 Nov 2020 10:48:41 +0100 Subject: [PATCH] d: Fix a couple of ICEs found in the dmd front-end (PR97842) - Segmentation fault on incomplete static if. - Segmentation fault resolving typeof() expression when gagging is on. Reviewed-on: https://github.com/dlang/dmd/pull/11971 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) +{ +}