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
This commit is contained in:
Iain Buclaw 2020-11-17 10:48:41 +01:00
parent fa9091ad93
commit 27d8c3516b
9 changed files with 93 additions and 1 deletions

View File

@ -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.

View File

@ -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();

View File

@ -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;

View File

@ -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)) {}
}
}

View File

@ -0,0 +1,9 @@
struct D(E)
{
void G() {
import imports.test21164d;
I;
}
}

View File

@ -0,0 +1,4 @@
import imports.test21164c;
enum N = O();
alias Q = R!(N, S);

View File

@ -0,0 +1,10 @@
enum S = 1;
struct O
{
}
struct R(O U, int W)
{
}

View File

@ -0,0 +1,9 @@
auto AB()
{
static if}
auto I()
{
AB;
}

View File

@ -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)
{
}