diff --git a/src/Expr.h b/src/Expr.h index 73929a2114..ffead932af 100644 --- a/src/Expr.h +++ b/src/Expr.h @@ -1642,6 +1642,9 @@ class CoerceToAnyExpr : public UnaryExpr { public: CoerceToAnyExpr(ExprPtr op); + bool IsReduced(Reducer* c) const override; + ExprPtr Reduce(Reducer* c, StmtPtr& red_stmt) override; + protected: ValPtr Fold(Val* v) const override; diff --git a/src/Stmt.cc b/src/Stmt.cc index a1edb51ee0..01e892ead0 100644 --- a/src/Stmt.cc +++ b/src/Stmt.cc @@ -1849,7 +1849,8 @@ void WhenInfo::Build(StmtPtr ws) { auto else_branch = timeout_s ? timeout_s : empty; auto do_bodies = make_intrusive(two_test, s, else_branch); - auto dummy_return = make_intrusive(true_const); + auto any_true_const = make_intrusive(true_const); + auto dummy_return = make_intrusive(any_true_const); auto shebang = make_intrusive(do_test, do_bodies, dummy_return); diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index 8516224106..7591affd7b 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -3094,6 +3094,23 @@ CoerceToAnyExpr::CoerceToAnyExpr(ExprPtr arg_op) : UnaryExpr(EXPR_TO_ANY_COERCE, type = base_type(TYPE_ANY); } +bool CoerceToAnyExpr::IsReduced(Reducer* c) const { return HasReducedOps(c); } + +ExprPtr CoerceToAnyExpr::Reduce(Reducer* c, StmtPtr& red_stmt) { + if ( c->Optimizing() ) + op = c->UpdateExpr(op); + + red_stmt = nullptr; + + if ( ! op->IsSingleton(c) ) + op = op->ReduceToSingleton(c, red_stmt); + + if ( c->Optimizing() ) + return ThisPtr(); + else + return AssignToTemporary(c, red_stmt); +} + ValPtr CoerceToAnyExpr::Fold(Val* v) const { return {NewRef{}, v}; } ExprPtr CoerceToAnyExpr::Duplicate() { return SetSucc(new CoerceToAnyExpr(op->Duplicate())); } diff --git a/src/script_opt/ZAM/OPs/ZAM.op b/src/script_opt/ZAM/OPs/ZAM.op index bd78716459..f773e60a2f 100644 --- a/src/script_opt/ZAM/OPs/ZAM.op +++ b/src/script_opt/ZAM/OPs/ZAM.op @@ -1567,7 +1567,7 @@ unary-expr-op To-Any-Coerce op-type X set-type $1 eval auto orig_lhs = frame[z.v1]; /* hold in case z.v1 = z.v2 */ - AssignV1(ZVal(frame[z.v2].ToVal(z.t), ZAM::any_base_type)) + frame[z.v1] = ZVal($1.ToVal(z.t), ZAM::any_base_type); ZVal::DeleteManagedType(orig_lhs); unary-expr-op From-Any-Coerce