From 20e2003009bf97f107057452ec2919f5baa3ec75 Mon Sep 17 00:00:00 2001 From: Tim Keith Date: Mon, 17 Dec 2018 15:19:11 -0800 Subject: [PATCH] [flang] Simplify creation of Expr values from ints. Original-commit: flang-compiler/f18@56f007493bdc74d155d85cfaa96166907a17c54a Reviewed-on: https://github.com/flang-compiler/f18/pull/247 Tree-same-pre-rewrite: false --- flang/lib/semantics/resolve-names.cc | 6 ++---- flang/lib/semantics/type.cc | 8 ++++++-- flang/lib/semantics/type.h | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/flang/lib/semantics/resolve-names.cc b/flang/lib/semantics/resolve-names.cc index 175172e..0b2c43b 100644 --- a/flang/lib/semantics/resolve-names.cc +++ b/flang/lib/semantics/resolve-names.cc @@ -2348,8 +2348,7 @@ Symbol &DeclarationVisitor::DeclareObjectEntity( void DeclarationVisitor::Post(const parser::IntrinsicTypeSpec::Character &x) { if (!charInfo_.length) { - charInfo_.length = ParamValue{SomeExpr{ - evaluate::AsExpr(evaluate::Constant{1})}}; + charInfo_.length = ParamValue{1}; } SetDeclTypeSpec(currScope().MakeCharacterType( std::move(*charInfo_.length), charInfo_.kind)); @@ -2370,8 +2369,7 @@ void DeclarationVisitor::Post(const parser::TypeParamValue &x) { } void DeclarationVisitor::Post(const parser::CharLength &x) { if (const auto *length{std::get_if(&x.u)}) { - charInfo_.length = ParamValue{SomeExpr{evaluate::AsExpr( - evaluate::Constant{*length})}}; + charInfo_.length = ParamValue{*length}; } } diff --git a/flang/lib/semantics/type.cc b/flang/lib/semantics/type.cc index 1b43a77..90ee0aa 100644 --- a/flang/lib/semantics/type.cc +++ b/flang/lib/semantics/type.cc @@ -61,8 +61,7 @@ std::ostream &operator<<(std::ostream &o, const DerivedTypeSpec &x) { Bound::Bound(int bound) : category_{Category::Explicit}, - expr_{SomeExpr{evaluate::AsExpr( - evaluate::Constant{bound})}} {} + expr_{evaluate::Expr{bound}} {} Bound Bound::Clone() const { return Bound(category_, MaybeExpr{expr_}); } @@ -95,6 +94,11 @@ std::ostream &operator<<(std::ostream &o, const ShapeSpec &x) { return o; } +ParamValue::ParamValue(MaybeExpr &&expr) + : category_{Category::Explicit}, expr_{std::move(expr)} {} +ParamValue::ParamValue(std::int64_t value) + : ParamValue(SomeExpr{evaluate::Expr{value}}) {} + std::ostream &operator<<(std::ostream &o, const ParamValue &x) { if (x.isAssumed()) { o << '*'; diff --git a/flang/lib/semantics/type.h b/flang/lib/semantics/type.h index 45f27b1..b38a0d4 100644 --- a/flang/lib/semantics/type.h +++ b/flang/lib/semantics/type.h @@ -78,8 +78,8 @@ class ParamValue { public: static const ParamValue Assumed() { return Category::Assumed; } static const ParamValue Deferred() { return Category::Deferred; } - ParamValue(MaybeExpr &&expr) - : category_{Category::Explicit}, expr_{std::move(expr)} {} + ParamValue(MaybeExpr &&expr); + ParamValue(std::int64_t); bool isExplicit() const { return category_ == Category::Explicit; } bool isAssumed() const { return category_ == Category::Assumed; } bool isDeferred() const { return category_ == Category::Deferred; } -- 2.7.4