diff --git a/src/Expr.h b/src/Expr.h index b92ae708c8..656933ce81 100644 --- a/src/Expr.h +++ b/src/Expr.h @@ -1153,6 +1153,9 @@ public: // Optimization-related: ExprPtr Duplicate() override; + 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/script_opt/Expr.cc b/src/script_opt/Expr.cc index dbf40a1991..c9679838a4 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -1917,6 +1917,22 @@ ExprPtr HasFieldExpr::Duplicate() return SetSucc(new HasFieldExpr(op->Duplicate(), util::copy_string(field_name))); } +bool HasFieldExpr::IsReduced(Reducer* c) const + { + return op->GetType()->FieldHasAttr(field, ATTR_OPTIONAL); + } + +ExprPtr HasFieldExpr::Reduce(Reducer* c, StmtPtr& red_stmt) + { + if ( ! op->GetType()->FieldHasAttr(field, ATTR_OPTIONAL) ) + { + auto true_constant = make_intrusive(val_mgr->True()); + return TransformMe(true_constant, c, red_stmt); + } + + return UnaryExpr::Reduce(c, red_stmt); + } + ExprPtr RecordConstructorExpr::Duplicate() { auto op_l = op->Duplicate()->AsListExprPtr();