Do not unnecessarily call postblit after rvalue array initializers.

Fixes DMD testcases 'sdtor' and 'structlit'.
This commit is contained in:
David Nadlinger 2013-01-04 10:19:03 +01:00
parent bcd8f26b26
commit 859177fe3d
3 changed files with 21 additions and 6 deletions

View file

@ -397,7 +397,7 @@ void DtoLeaveMonitor(LLValue* v)
// is this a good approach at all ?
void DtoAssign(Loc& loc, DValue* lhs, DValue* rhs, int op)
void DtoAssign(Loc& loc, DValue* lhs, DValue* rhs, int op, bool canSkipPostblit)
{
Logger::println("DtoAssign()");
LOG_SCOPE;
@ -424,7 +424,9 @@ void DtoAssign(Loc& loc, DValue* lhs, DValue* rhs, int op)
else if (DtoArrayElementType(t)->equals(stripModifiers(t2))) {
DtoArrayInit(loc, s, rhs, op);
}
else if (op != -1 && op != TOKblit && arrayNeedsPostblit(t)) {
else if (op != -1 && op != TOKblit && !canSkipPostblit &&
arrayNeedsPostblit(t)
) {
DtoArrayAssign(s, rhs, op);
}
#endif
@ -462,7 +464,9 @@ void DtoAssign(Loc& loc, DValue* lhs, DValue* rhs, int op)
else if (DtoArrayElementType(t)->equals(stripModifiers(t2))) {
DtoArrayInit(loc, lhs, rhs, op);
}
else if (op != -1 && op != TOKblit && arrayNeedsPostblit(t)) {
else if (op != -1 && op != TOKblit && !canSkipPostblit &&
arrayNeedsPostblit(t)
) {
DtoArrayAssign(lhs, rhs, op);
}
#endif