Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 35 additions & 41 deletions compiler/src/dmd/expressionsem.d
Original file line number Diff line number Diff line change
Expand Up @@ -15013,54 +15013,48 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor
if (auto die = exp.econd.isDotIdExp())
die.noderef = true;

Expression ec = exp.econd.expressionSemantic(sc);
ec = resolveProperties(sc, ec);
ec = ec.toBoolean(sc);
{
bool checkForErrors(Expression e)
{
if (e.op == EXP.error)
{
result = e;
return true;
}
if (e.type == Type.terror)
{
setError();
return true;
}
return false;
}

CtorFlow ctorflow_root = sc.ctorflow.clone();
Expression e1x = exp.e1.expressionSemantic(sc).arrayFuncConv(sc);
e1x = resolveProperties(sc, e1x);
Expression ec = exp.econd.expressionSemantic(sc);
ec = resolveProperties(sc, ec);
ec = ec.toBoolean(sc);

CtorFlow ctorflow1 = sc.ctorflow;
sc.ctorflow = ctorflow_root;
Expression e2x = exp.e2.expressionSemantic(sc).arrayFuncConv(sc);
e2x = resolveProperties(sc, e2x);
CtorFlow ctorflow_root = sc.ctorflow.clone();
Expression e1x = exp.e1.expressionSemantic(sc).arrayFuncConv(sc);
e1x = resolveProperties(sc, e1x);

sc.merge(exp.loc, ctorflow1);
ctorflow1.freeFieldinit();
CtorFlow ctorflow1 = sc.ctorflow;
sc.ctorflow = ctorflow_root;
Expression e2x = exp.e2.expressionSemantic(sc).arrayFuncConv(sc);
e2x = resolveProperties(sc, e2x);

if (ec.op == EXP.error)
{
result = ec;
return;
}
if (ec.type == Type.terror)
return setError();
exp.econd = ec;
sc.merge(exp.loc, ctorflow1);
ctorflow1.freeFieldinit();

if (e1x.op == EXP.error)
{
result = e1x;
return;
}
if (e1x.type == Type.terror)
return setError();
exp.e1 = e1x;
if (checkForErrors(ec)) return;
if (checkForErrors(e1x)) return;
if (checkForErrors(e2x)) return;

if (e2x.op == EXP.error)
{
result = e2x;
return;
auto f0 = checkNonAssignmentArrayOp(exp.econd);
auto f1 = checkNonAssignmentArrayOp(exp.e1);
auto f2 = checkNonAssignmentArrayOp(exp.e2);
if (f0 || f1 || f2)
return setError();
}
if (e2x.type == Type.terror)
return setError();
exp.e2 = e2x;

auto f0 = checkNonAssignmentArrayOp(exp.econd);
auto f1 = checkNonAssignmentArrayOp(exp.e1);
auto f2 = checkNonAssignmentArrayOp(exp.e2);
if (f0 || f1 || f2)
return setError();

Type t1 = exp.e1.type;
Type t2 = exp.e2.type;
Expand Down
Loading