diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2020-11-17 10:48:41 +0100 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2020-11-18 10:22:06 +0100 |
commit | 27d8c3516b67c0f5a8fe8970d0558ee3b97e8281 (patch) | |
tree | 915f1bb7526195a5ea70a21f4779fe17d70efdaf /gcc | |
parent | fa9091ad93b2ec6f2580e9f9c7de799fa404cf2e (diff) | |
download | gcc-27d8c3516b67c0f5a8fe8970d0558ee3b97e8281.zip gcc-27d8c3516b67c0f5a8fe8970d0558ee3b97e8281.tar.gz gcc-27d8c3516b67c0f5a8fe8970d0558ee3b97e8281.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/d/dmd/MERGE | 2 | ||||
-rw-r--r-- | gcc/d/dmd/cond.c | 4 | ||||
-rw-r--r-- | gcc/d/dmd/mtype.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/fail_compilation/fail18970.d | 37 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/fail_compilation/imports/test21164a.d | 9 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/fail_compilation/imports/test21164b.d | 4 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/fail_compilation/imports/test21164c.d | 10 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/fail_compilation/imports/test21164d.d | 9 | ||||
-rw-r--r-- | gcc/testsuite/gdc.test/fail_compilation/test21164.d | 13 |
9 files changed, 93 insertions, 1 deletions
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index e2a0bab..b00cb82 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 beda133..9f76e83 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 bc66be0..6f0195a 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 0000000..846a578 --- /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 0000000..e5fcd43 --- /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 0000000..ece5476 --- /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 0000000..21a252f --- /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 0000000..08f83ea --- /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 0000000..f42c4bc --- /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) +{ +} |