Navigation Menu

Skip to content

Commit

Permalink
CTFE classes aren't reference types
Browse files Browse the repository at this point in the history
They are actually values. Fixes a bug with member classes.
  • Loading branch information
Don Clugston committed Nov 4, 2011
1 parent 18d5e19 commit 3458608
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 7 deletions.
11 changes: 4 additions & 7 deletions src/interpret.c
Expand Up @@ -3282,8 +3282,7 @@ Expression *BinExp::interpretAssignCommon(InterState *istate, CtfeGoal goal, fp_
}
bool wantRef = false;
if (!fp && this->e1->type->toBasetype() == this->e2->type->toBasetype() &&
(e1->type->toBasetype()->ty == Tarray || e1->type->toBasetype()->ty == Taarray ||
e1->type->toBasetype()->ty == Tclass)
(e1->type->toBasetype()->ty == Tarray || e1->type->toBasetype()->ty == Taarray)
// e = *x is never a reference, because *x is always a value
&& this->e2->op != TOKstar
)
Expand Down Expand Up @@ -6105,8 +6104,9 @@ bool isStackValueValid(Expression *newval)
newval->error("CTFE internal error: illegal pointer value %s\n", newval->toChars());
return false;
}
if (newval->op == TOKclassreference || (newval->op == TOKnull && newval->type->ty == Tclass))
return true;
if ((newval->op == TOKarrayliteral) || ( newval->op == TOKstructliteral) ||
(newval->op == TOKclassreference) ||
(newval->op == TOKstring) || (newval->op == TOKassocarrayliteral) ||
(newval->op == TOKnull) || (newval->op == TOKslice))
{ return false;
Expand Down Expand Up @@ -6162,8 +6162,7 @@ bool isRefValueValid(Expression *newval)
}
// Dynamic arrays passed by ref may be null. When this happens
// they may originate from an index or dotvar expression.
if (newval->type->ty == Tarray || newval->type->ty == Taarray
|| newval->type->ty == Tclass)
if (newval->type->ty == Tarray || newval->type->ty == Taarray)
if (newval->op == TOKdotvar || newval->op == TOKindex)
return isStackValueValid(newval); // actually must be null
if (newval->op == TOKslice)
Expand All @@ -6174,8 +6173,6 @@ bool isRefValueValid(Expression *newval)
assert(se->e1->op == TOKarrayliteral || se->e1->op == TOKstring);
return true;
}
if (newval->op == TOKclassreference)
return true;
newval->error("CTFE internal error: illegal reference value %s\n", newval->toChars());
return false;
}
Expand Down
20 changes: 20 additions & 0 deletions test/compilable/interpret3.d
Expand Up @@ -3006,6 +3006,26 @@ SomeClass classtest2(int n)
static assert(is(typeof( (){ enum xx = classtest2(2);}() )));
static assert(!is(typeof( (){ enum xx = classtest2(5);}() )));

class RecursiveClass
{
int x;
this(int n) { x = n; }
RecursiveClass b;
void doit() { b = new RecursiveClass(7); b.x = 2;}
}

int classtest3()
{
RecursiveClass x = new RecursiveClass(17);
x.doit();
RecursiveClass y = x.b;
assert(y.x == 2);
assert(x.x == 17);
return 1;
}

static assert(classtest3());

/**************************************************
6885 wrong code with new array
**************************************************/
Expand Down

0 comments on commit 3458608

Please sign in to comment.