7,656 changes: 3,723 additions & 3,933 deletions src/e2ir.c

Large diffs are not rendered by default.

78 changes: 3 additions & 75 deletions src/expression.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ bool hasSideEffect(Expression *e);
bool canThrow(Expression *e, bool mustNotThrow);
Expression *Expression_optimize(Expression *e, int result, bool keepLvalue);
dt_t **Expression_toDt(Expression *e, dt_t **pdt);
elem *toElem(Expression *e, IRState *irs);
MATCH implicitConvTo(Expression *e, Type *t);
Expression *implicitCastTo(Expression *e, Scope *sc, Type *t);
Expression *castTo(Expression *e, Scope *sc, Type *t);
Expand Down Expand Up @@ -220,9 +221,8 @@ class Expression : public RootObject
Expression *inlineCopy(Scope *sc);

// Back end
virtual elem *toElem(IRState *irs);
elem *toElemDtor(IRState *irs);
virtual dt_t **toDt(dt_t **pdt) { return ::Expression_toDt(this, pdt); }
elem *toElem(IRState *irs) { return ::toElem(this, irs); }
dt_t **toDt(dt_t **pdt) { return ::Expression_toDt(this, pdt); }
virtual void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -243,7 +243,6 @@ class IntegerExp : public Expression
int isBool(int result);
void toMangleBuffer(OutBuffer *buf);
Expression *toLvalue(Scope *sc, Expression *e);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand Down Expand Up @@ -272,7 +271,6 @@ class RealExp : public Expression
complex_t toComplex();
int isBool(int result);
void toMangleBuffer(OutBuffer *buf);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -292,7 +290,6 @@ class ComplexExp : public Expression
complex_t toComplex();
int isBool(int result);
void toMangleBuffer(OutBuffer *buf);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand Down Expand Up @@ -346,7 +343,6 @@ class ThisExp : public Expression

Expression *doInline(InlineDoState *ids);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -371,7 +367,6 @@ class NullExp : public Expression
int isBool(int result);
StringExp *toStringExp();
void toMangleBuffer(OutBuffer *buf);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand Down Expand Up @@ -402,7 +397,6 @@ class StringExp : public Expression
Expression *modifiableLvalue(Scope *sc, Expression *e);
unsigned charAt(uinteger_t i);
void toMangleBuffer(OutBuffer *buf);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -428,7 +422,6 @@ class TupleExp : public Expression
bool equals(RootObject *o);
Expression *semantic(Scope *sc);
void checkEscape();
elem *toElem(IRState *irs);

Expression *doInline(InlineDoState *ids);
void accept(Visitor *v) { v->visit(this); }
Expand All @@ -447,7 +440,6 @@ class ArrayLiteralExp : public Expression
bool equals(RootObject *o);
Expression *semantic(Scope *sc);
int isBool(int result);
elem *toElem(IRState *irs);
StringExp *toStringExp();
void toMangleBuffer(OutBuffer *buf);
Expression *inferType(Type *t, int flag = 0, Scope *sc = NULL, TemplateParameters *tparams = NULL);
Expand All @@ -468,7 +460,6 @@ class AssocArrayLiteralExp : public Expression
Expression *syntaxCopy();
Expression *semantic(Scope *sc);
int isBool(int result);
elem *toElem(IRState *irs);
void toMangleBuffer(OutBuffer *buf);
Expression *inferType(Type *t, int flag = 0, Scope *sc = NULL, TemplateParameters *tparams = NULL);

Expand Down Expand Up @@ -525,7 +516,6 @@ class StructLiteralExp : public Expression
Expression *semantic(Scope *sc);
Expression *getField(Type *type, unsigned offset);
int getFieldIndex(Type *type, unsigned offset);
elem *toElem(IRState *irs);
void toMangleBuffer(OutBuffer *buf);
Expression *addDtorHook(Scope *sc);
Symbol *toSymbol();
Expand All @@ -544,7 +534,6 @@ class TypeExp : public Expression
Expression *syntaxCopy();
Expression *semantic(Scope *sc);
int rvalue(bool allowVoid = false);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -556,7 +545,6 @@ class ScopeExp : public Expression
ScopeExp(Loc loc, ScopeDsymbol *sds);
Expression *syntaxCopy();
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand Down Expand Up @@ -591,7 +579,6 @@ class NewExp : public Expression
Type *newtype, Expressions *arguments);
Expression *syntaxCopy();
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);

Expression *doInline(InlineDoState *ids);
void accept(Visitor *v) { v->visit(this); }
Expand Down Expand Up @@ -622,7 +609,6 @@ class SymbolExp : public Expression

SymbolExp(Loc loc, TOK op, int size, Declaration *var, bool hasOverloads);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand Down Expand Up @@ -692,7 +678,6 @@ class FuncExp : public Expression
Expression *semantic(Scope *sc, Expressions *arguments);
Expression *inferType(Type *t, int flag = 0, Scope *sc = NULL, TemplateParameters *tparams = NULL);
char *toChars();
elem *toElem(IRState *irs);

//Expression *doInline(InlineDoState *ids);
void accept(Visitor *v) { v->visit(this); }
Expand All @@ -708,7 +693,6 @@ class DeclarationExp : public Expression
DeclarationExp(Loc loc, Dsymbol *declaration);
Expression *syntaxCopy();
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);

Expression *doInline(InlineDoState *ids);
void accept(Visitor *v) { v->visit(this); }
Expand Down Expand Up @@ -746,7 +730,6 @@ class HaltExp : public Expression
HaltExp(Loc loc);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand Down Expand Up @@ -817,7 +800,6 @@ class BinExp : public Expression
Expression *compare_overload(Scope *sc, Identifier *id);
Expression *reorderSettingAAElem(Scope *sc);

elem *toElemBin(IRState *irs, int op);
void accept(Visitor *v) { v->visit(this); }
};

Expand Down Expand Up @@ -868,7 +850,6 @@ class AssertExp : public UnaExp

Expression *doInline(InlineDoState *ids);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand Down Expand Up @@ -906,7 +887,6 @@ class DotVarExp : public UnaExp
int isLvalue();
Expression *toLvalue(Scope *sc, Expression *e);
Expression *modifiableLvalue(Scope *sc, Expression *e);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -932,7 +912,6 @@ class DelegateExp : public UnaExp
DelegateExp(Loc loc, Expression *e, FuncDeclaration *func, bool hasOverloads = false);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -943,7 +922,6 @@ class DotTypeExp : public UnaExp

DotTypeExp(Loc loc, Expression *e, Dsymbol *sym);
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -964,7 +942,6 @@ class CallExp : public UnaExp

Expression *syntaxCopy();
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
int isLvalue();
Expression *toLvalue(Scope *sc, Expression *e);
Expression *addDtorHook(Scope *sc);
Expand All @@ -979,7 +956,6 @@ class AddrExp : public UnaExp
AddrExp(Loc loc, Expression *e);
Expression *semantic(Scope *sc);
void checkEscape();
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -994,7 +970,6 @@ class PtrExp : public UnaExp
int isLvalue();
Expression *toLvalue(Scope *sc, Expression *e);
Expression *modifiableLvalue(Scope *sc, Expression *e);
elem *toElem(IRState *irs);

void accept(Visitor *v) { v->visit(this); }
};
Expand All @@ -1005,7 +980,6 @@ class NegExp : public UnaExp
NegExp(Loc loc, Expression *e);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1024,7 +998,6 @@ class ComExp : public UnaExp
ComExp(Loc loc, Expression *e);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1033,7 +1006,6 @@ class NotExp : public UnaExp
public:
NotExp(Loc loc, Expression *e);
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1042,7 +1014,6 @@ class BoolExp : public UnaExp
public:
BoolExp(Loc loc, Expression *e, Type *type);
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1052,7 +1023,6 @@ class DeleteExp : public UnaExp
DeleteExp(Loc loc, Expression *e);
Expression *semantic(Scope *sc);
Expression *checkToBoolean(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1068,7 +1038,6 @@ class CastExp : public UnaExp
Expression *syntaxCopy();
Expression *semantic(Scope *sc);
void checkEscape();
elem *toElem(IRState *irs);

// For operator overloading
Expression *op_overload(Scope *sc);
Expand All @@ -1084,7 +1053,6 @@ class VectorExp : public UnaExp
VectorExp(Loc loc, Expression *e, Type *t);
Expression *syntaxCopy();
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1106,7 +1074,6 @@ class SliceExp : public UnaExp
Expression *modifiableLvalue(Scope *sc, Expression *e);
int isBool(int result);
Type *toStaticArrayType();
elem *toElem(IRState *irs);

Expression *doInline(InlineDoState *ids);
void accept(Visitor *v) { v->visit(this); }
Expand All @@ -1117,7 +1084,6 @@ class ArrayLengthExp : public UnaExp
public:
ArrayLengthExp(Loc loc, Expression *e1);
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);

static Expression *rewriteOpAssign(BinExp *exp);
void accept(Visitor *v) { v->visit(this); }
Expand Down Expand Up @@ -1168,7 +1134,6 @@ class CommaExp : public BinExp
Expression *modifiableLvalue(Scope *sc, Expression *e);
int isBool(int result);
Expression *addDtorHook(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1188,7 +1153,6 @@ class IndexExp : public BinExp
Expression *modifiableLvalue(Scope *sc, Expression *e);
Expression *doInline(InlineDoState *ids);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1199,7 +1163,6 @@ class PostExp : public BinExp
public:
PostExp(TOK op, Loc loc, Expression *e);
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1222,7 +1185,6 @@ class AssignExp : public BinExp
Expression *semantic(Scope *sc);
Expression *checkToBoolean(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1237,63 +1199,55 @@ class AddAssignExp : public BinAssignExp
{
public:
AddAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class MinAssignExp : public BinAssignExp
{
public:
MinAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class MulAssignExp : public BinAssignExp
{
public:
MulAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class DivAssignExp : public BinAssignExp
{
public:
DivAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class ModAssignExp : public BinAssignExp
{
public:
ModAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class AndAssignExp : public BinAssignExp
{
public:
AndAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class OrAssignExp : public BinAssignExp
{
public:
OrAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class XorAssignExp : public BinAssignExp
{
public:
XorAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1302,31 +1256,27 @@ class PowAssignExp : public BinAssignExp
public:
PowAssignExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class ShlAssignExp : public BinAssignExp
{
public:
ShlAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class ShrAssignExp : public BinAssignExp
{
public:
ShrAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class UshrAssignExp : public BinAssignExp
{
public:
UshrAssignExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1335,7 +1285,6 @@ class CatAssignExp : public BinAssignExp
public:
CatAssignExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1345,7 +1294,6 @@ class AddExp : public BinExp
AddExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1355,7 +1303,6 @@ class MinExp : public BinExp
MinExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1365,7 +1312,6 @@ class CatExp : public BinExp
CatExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1375,7 +1321,6 @@ class MulExp : public BinExp
MulExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1385,7 +1330,6 @@ class DivExp : public BinExp
DivExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1395,7 +1339,6 @@ class ModExp : public BinExp
ModExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1405,7 +1348,6 @@ class PowExp : public BinExp
PowExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1415,7 +1357,6 @@ class ShlExp : public BinExp
ShlExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1425,7 +1366,6 @@ class ShrExp : public BinExp
ShrExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1435,7 +1375,6 @@ class UshrExp : public BinExp
UshrExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1445,7 +1384,6 @@ class AndExp : public BinExp
AndExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1455,7 +1393,6 @@ class OrExp : public BinExp
OrExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1465,7 +1402,6 @@ class XorExp : public BinExp
XorExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1475,7 +1411,6 @@ class OrOrExp : public BinExp
OrOrExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);
Expression *checkToBoolean(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1485,7 +1420,6 @@ class AndAndExp : public BinExp
AndAndExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);
Expression *checkToBoolean(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1498,7 +1432,6 @@ class CmpExp : public BinExp
// For operator overloading
Expression *op_overload(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1508,15 +1441,13 @@ class InExp : public BinExp
InExp(Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

class RemoveExp : public BinExp
{
public:
RemoveExp(Loc loc, Expression *e1, Expression *e2);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1531,7 +1462,6 @@ class EqualExp : public BinExp
// For operator overloading
Expression *op_overload(Scope *sc);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1542,7 +1472,6 @@ class IdentityExp : public BinExp
public:
IdentityExp(TOK op, Loc loc, Expression *e1, Expression *e2);
Expression *semantic(Scope *sc);
elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand All @@ -1567,7 +1496,6 @@ class CondExp : public BinExp

Expression *doInline(InlineDoState *ids);

elem *toElem(IRState *irs);
void accept(Visitor *v) { v->visit(this); }
};

Expand Down
39 changes: 14 additions & 25 deletions src/s2ir.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,23 +39,12 @@
static char __file__[] = __FILE__; // for tassert.h
#include "tassert.h"

elem *callfunc(Loc loc,
IRState *irs,
int directcall, // 1: don't do virtual call
Type *tret, // return type
elem *ec, // evaluates to function address
Type *ectype, // original type of ec
FuncDeclaration *fd, // if !=NULL, this is the function being called
Type *t, // TypeDelegate or TypeFunction for this function
elem *ehidden, // if !=NULL, this is the 'hidden' argument
Expressions *arguments);

elem *exp2_copytotemp(elem *e);
elem *incUsageElem(IRState *irs, Loc loc);
StructDeclaration *needsPostblit(Type *t);
elem *addressElem(elem *e, Type *t, bool alwaysCopy = false);
Blocks *Blocks_create();
type *Type_toCtype(Type *t);
elem *toElemDtor(Expression *e, IRState *irs);

#define elem_setLoc(e,loc) ((e)->Esrcpos.Sfilename = (char *)(loc).filename, \
(e)->Esrcpos.Slinnum = (loc).linnum)
Expand Down Expand Up @@ -168,7 +157,7 @@ class S2irVisitor : public Visitor
block *bexit = mystate.breakBlock ? mystate.breakBlock : block_calloc();

incUsage(irs, s->loc);
e = s->condition->toElemDtor(&mystate);
e = toElemDtor(s->condition, &mystate);
block_appendexp(blx->curblock, e);
block *bcond = blx->curblock;
block_next(blx, BCiftrue, NULL);
Expand Down Expand Up @@ -244,7 +233,7 @@ class S2irVisitor : public Visitor

block_next(blx, BCgoto, mystate.contBlock);
incUsage(irs, s->condition->loc);
block_appendexp(mystate.contBlock, s->condition->toElemDtor(&mystate));
block_appendexp(mystate.contBlock, toElemDtor(s->condition, &mystate));
block_next(blx, BCiftrue, mystate.breakBlock);

}
Expand All @@ -270,7 +259,7 @@ class S2irVisitor : public Visitor
if (s->condition)
{
incUsage(irs, s->condition->loc);
block_appendexp(bcond, s->condition->toElemDtor(&mystate));
block_appendexp(bcond, toElemDtor(s->condition, &mystate));
block_next(blx,BCiftrue,NULL);
bcond->appendSucc(blx->curblock);
bcond->appendSucc(mystate.breakBlock);
Expand All @@ -292,7 +281,7 @@ class S2irVisitor : public Visitor
if (s->increment)
{
incUsage(irs, s->increment->loc);
block_appendexp(mystate.contBlock, s->increment->toElemDtor(&mystate));
block_appendexp(mystate.contBlock, toElemDtor(s->increment, &mystate));
}

/* The 'break' block follows the for statement.
Expand Down Expand Up @@ -484,7 +473,7 @@ class S2irVisitor : public Visitor
numcases = s->cases->dim;

incUsage(irs, s->loc);
elem *econd = s->condition->toElemDtor(&mystate);
elem *econd = toElemDtor(s->condition, &mystate);
if (s->hasVars)
{ /* Generate a sequence of if-then-else blocks for the cases.
*/
Expand All @@ -498,7 +487,7 @@ class S2irVisitor : public Visitor
for (size_t i = 0; i < numcases; i++)
{ CaseStatement *cs = (*s->cases)[i];

elem *ecase = cs->exp->toElemDtor(&mystate);
elem *ecase = toElemDtor(cs->exp, &mystate);
elem *e = el_bin(OPeqeq, TYbool, el_copytree(econd), ecase);
block *b = blx->curblock;
block_appendexp(b, e);
Expand Down Expand Up @@ -768,12 +757,12 @@ class S2irVisitor : public Visitor
se->sym = irs->shidden;
se->soffset = 0;
se->fillHoles = 1;
e = s->exp->toElemDtor(irs);
e = toElemDtor(s->exp, irs);
memcpy((void*)se, save, sizeof(StructLiteralExp));

}
else
e = s->exp->toElemDtor(irs);
e = toElemDtor(s->exp, irs);
assert(e);

if (s->exp->op == TOKstructliteral ||
Expand Down Expand Up @@ -803,11 +792,11 @@ class S2irVisitor : public Visitor
else if (tf->isref)
{ // Reference return, so convert to a pointer
Expression *ae = s->exp->addressOf(NULL);
e = ae->toElemDtor(irs);
e = toElemDtor(ae, irs);
}
else
{
e = s->exp->toElemDtor(irs);
e = toElemDtor(s->exp, irs);
assert(e);
}
elem_setLoc(e, s->loc);
Expand Down Expand Up @@ -841,7 +830,7 @@ class S2irVisitor : public Visitor
//printf("ExpStatement::toIR(), exp = %s\n", exp ? exp->toChars() : "");
incUsage(irs, s->loc);
if (s->exp)
block_appendexp(blx->curblock,s->exp->toElemDtor(irs));
block_appendexp(blx->curblock,toElemDtor(s->exp, irs));
}

/**************************************
Expand Down Expand Up @@ -969,7 +958,7 @@ class S2irVisitor : public Visitor
// Perform initialization of with handle
ie = s->wthis->init->isExpInitializer();
assert(ie);
ei = ie->exp->toElemDtor(irs);
ei = toElemDtor(ie->exp, irs);
e = el_var(sp);
e = el_bin(OPeq,e->Ety, e, ei);
elem_setLoc(e, s->loc);
Expand All @@ -992,7 +981,7 @@ class S2irVisitor : public Visitor
Blockx *blx = irs->blx;

incUsage(irs, s->loc);
elem *e = s->exp->toElemDtor(irs);
elem *e = toElemDtor(s->exp, irs);
e = el_bin(OPcall, TYvoid, el_var(rtlsym[RTLSYM_THROWC]),e);
block_appendexp(blx->curblock, e);
}
Expand Down