mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-01-11 18:33:14 +01:00
Fixed dmdfe generated class invariant calls. Also insert proper "this !is null" check before it. Fixed invariant* dstress regressions and generally seems like a good idea. Hope I didn't break anything.. minitests run fine!
This commit is contained in:
22
dmd/func.c
22
dmd/func.c
@@ -1232,6 +1232,7 @@ void FuncDeclaration::semantic3(Scope *sc)
|
||||
if (addPreInvariant())
|
||||
{
|
||||
Expression *e = NULL;
|
||||
Expression *ee = NULL;
|
||||
if (isDtorDeclaration())
|
||||
{
|
||||
// Call invariant directly only if it exists
|
||||
@@ -1256,11 +1257,30 @@ void FuncDeclaration::semantic3(Scope *sc)
|
||||
{ // Call invariant virtually
|
||||
ThisExp *v = new ThisExp(0);
|
||||
v->type = vthis->type;
|
||||
e = new AssertExp(loc, v, NULL);
|
||||
|
||||
// LDC: check for null this
|
||||
v = new ThisExp(0);
|
||||
v->type = vthis->type;
|
||||
v->var = vthis;
|
||||
|
||||
NullExp *nv = new NullExp(0);
|
||||
nv->type = v->type;
|
||||
|
||||
IdentityExp *ie = new IdentityExp(TOKnotidentity, 0, v, nv);
|
||||
ie->type = Type::tbool;
|
||||
|
||||
Expression *se = new StringExp(0, (char *)"null this");
|
||||
se = se->semantic(sc);
|
||||
se->type = Type::tchar->arrayOf();
|
||||
e = new AssertExp(loc, v, se);
|
||||
|
||||
ee = new AssertExp(loc, ie, se);
|
||||
}
|
||||
if (ee)
|
||||
{
|
||||
ExpStatement *s = new ExpStatement(0, ee);
|
||||
a->push(s);
|
||||
}
|
||||
if (e)
|
||||
{
|
||||
ExpStatement *s = new ExpStatement(0, e);
|
||||
|
||||
@@ -1753,9 +1753,8 @@ DValue* AssertExp::toElem(IRState* p)
|
||||
LLValue* thisarg = p->func()->thisArg;
|
||||
assert(thisarg && "null thisarg, but we're in assert(this) exp;");
|
||||
LLValue* thisptr = DtoLoad(p->func()->thisArg);
|
||||
LLValue* thisnotnull = p->ir->CreateIsNotNull(thisptr);
|
||||
cond = new DImValue(Type::tbool, thisnotnull);
|
||||
condty = Type::tbool;
|
||||
condty = e1->type->toBasetype();
|
||||
cond = new DImValue(condty, thisptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user