From d986a35a5cff95c1c29973fb8260a68740442284 Mon Sep 17 00:00:00 2001 From: peter klausler Date: Tue, 14 Aug 2018 14:35:51 -0700 Subject: [PATCH] [flang] Extirpate expression-forward.h Original-commit: flang-compiler/f18@288acd399304de69c154b7b7bfe3b9d0ccd32a7d Reviewed-on: https://github.com/flang-compiler/f18/pull/183 Tree-same-pre-rewrite: false --- flang/lib/evaluate/expression-forward.h | 47 ------------ flang/lib/evaluate/expression.cc | 128 ++++++++++++++++++-------------- flang/lib/evaluate/expression.h | 41 ++++++---- flang/lib/evaluate/type.h | 1 + flang/lib/evaluate/variable.h | 3 +- flang/lib/semantics/expression.cc | 26 ++++--- flang/test/evaluate/expression.cc | 1 + 7 files changed, 121 insertions(+), 126 deletions(-) delete mode 100644 flang/lib/evaluate/expression-forward.h diff --git a/flang/lib/evaluate/expression-forward.h b/flang/lib/evaluate/expression-forward.h deleted file mode 100644 index 69c6dc7..0000000 --- a/flang/lib/evaluate/expression-forward.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef FORTRAN_EVALUATE_EXPRESSION_FORWARD_H_ -#define FORTRAN_EVALUATE_EXPRESSION_FORWARD_H_ - -// Some forward definitions for expression.h that need to be available -// in variable.h to resolve cases of mutual references between class -// definitions. - -#include "type.h" - -namespace Fortran::evaluate { - -// An expression of some specific result type. -template class Expr; - -// TODO: pmk: obsolete? -template using IntegerExpr = Expr>; -using DefaultIntegerExpr = Expr; -template using RealExpr = Expr>; -template using ComplexExpr = Expr>; -template -using CharacterExpr = Expr>; -template using LogicalExpr = Expr>; - -// An expression whose result is within one particular type category and -// of any supported kind. -using SomeKindIntegerExpr = Expr>; -using SomeKindRealExpr = Expr>; -using SomeKindComplexExpr = Expr>; -using SomeKindCharacterExpr = Expr>; -using SomeKindLogicalExpr = Expr>; - -} // namespace Fortran::evaluate -#endif // FORTRAN_EVALUATE_EXPRESSION_FORWARD_H_ diff --git a/flang/lib/evaluate/expression.cc b/flang/lib/evaluate/expression.cc index 0536083..10a5a6b 100644 --- a/flang/lib/evaluate/expression.cc +++ b/flang/lib/evaluate/expression.cc @@ -76,7 +76,8 @@ std::ostream &Binary::Dump( } template -std::ostream &IntegerExpr::Dump(std::ostream &o) const { +std::ostream &Expr>::Dump( + std::ostream &o) const { std::visit( common::visitors{[&](const Scalar &n) { o << n.SignedDecimal(); }, [&](const CopyableIndirection &d) { d->Dump(o); }, @@ -97,7 +98,9 @@ std::ostream &IntegerExpr::Dump(std::ostream &o) const { return o; } -template std::ostream &RealExpr::Dump(std::ostream &o) const { +template +std::ostream &Expr>::Dump( + std::ostream &o) const { std::visit(common::visitors{[&](const Scalar &n) { o << n.DumpHexadecimal(); }, @@ -124,7 +127,8 @@ template std::ostream &RealExpr::Dump(std::ostream &o) const { } template -std::ostream &ComplexExpr::Dump(std::ostream &o) const { +std::ostream &Expr>::Dump( + std::ostream &o) const { std::visit(common::visitors{[&](const Scalar &n) { o << n.DumpHexadecimal(); }, @@ -144,7 +148,8 @@ std::ostream &ComplexExpr::Dump(std::ostream &o) const { } template -std::ostream &CharacterExpr::Dump(std::ostream &o) const { +std::ostream &Expr>::Dump( + std::ostream &o) const { std::visit(common::visitors{[&](const Scalar &s) { o << parser::QuoteCharacterLiteral(s); }, @@ -164,7 +169,8 @@ template std::ostream &Comparison::Dump(std::ostream &o) const { } template -std::ostream &LogicalExpr::Dump(std::ostream &o) const { +std::ostream &Expr>::Dump( + std::ostream &o) const { std::visit(common::visitors{[&](const Scalar &tf) { o << (tf.IsTrue() ? ".TRUE." : ".FALSE."); }, @@ -181,7 +187,8 @@ std::ostream &LogicalExpr::Dump(std::ostream &o) const { } // LEN() -template Expr CharacterExpr::LEN() const { +template +Expr Expr>::LEN() const { return std::visit( common::visitors{[](const Scalar &c) { // std::string::size_type isn't convertible to uint64_t @@ -238,7 +245,7 @@ auto Binary::Fold(FoldingContext &context) } template -auto IntegerExpr::ConvertInteger::FoldScalar( +auto Expr>::ConvertInteger::FoldScalar( FoldingContext &context, const SomeKindScalar &c) -> std::optional> { return std::visit( @@ -254,7 +261,7 @@ auto IntegerExpr::ConvertInteger::FoldScalar( } template -auto IntegerExpr::ConvertReal::FoldScalar( +auto Expr>::ConvertReal::FoldScalar( FoldingContext &context, const SomeKindScalar &c) -> std::optional> { return std::visit( @@ -275,8 +282,9 @@ auto IntegerExpr::ConvertReal::FoldScalar( } template -auto IntegerExpr::Negate::FoldScalar(FoldingContext &context, - const Scalar &c) -> std::optional> { +auto Expr>::Negate::FoldScalar( + FoldingContext &context, const Scalar &c) + -> std::optional> { auto negated{c.Negate()}; if (negated.overflow) { context.messages.Say("integer negation overflowed"_en_US); @@ -286,7 +294,7 @@ auto IntegerExpr::Negate::FoldScalar(FoldingContext &context, } template -auto IntegerExpr::Add::FoldScalar( +auto Expr>::Add::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto sum{a.AddSigned(b)}; @@ -298,7 +306,7 @@ auto IntegerExpr::Add::FoldScalar( } template -auto IntegerExpr::Subtract::FoldScalar( +auto Expr>::Subtract::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto diff{a.SubtractSigned(b)}; @@ -310,7 +318,7 @@ auto IntegerExpr::Subtract::FoldScalar( } template -auto IntegerExpr::Multiply::FoldScalar( +auto Expr>::Multiply::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto product{a.MultiplySigned(b)}; @@ -322,7 +330,7 @@ auto IntegerExpr::Multiply::FoldScalar( } template -auto IntegerExpr::Divide::FoldScalar( +auto Expr>::Divide::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto qr{a.DivideSigned(b)}; @@ -338,7 +346,7 @@ auto IntegerExpr::Divide::FoldScalar( } template -auto IntegerExpr::Power::FoldScalar( +auto Expr>::Power::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { typename Scalar::PowerWithErrors power{a.Power(b)}; @@ -358,7 +366,7 @@ auto IntegerExpr::Power::FoldScalar( } template -auto IntegerExpr::Max::FoldScalar( +auto Expr>::Max::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { if (a.CompareSigned(b) == Ordering::Greater) { @@ -368,7 +376,7 @@ auto IntegerExpr::Max::FoldScalar( } template -auto IntegerExpr::Min::FoldScalar( +auto Expr>::Min::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { if (a.CompareSigned(b) == Ordering::Less) { @@ -378,7 +386,7 @@ auto IntegerExpr::Min::FoldScalar( } template -auto IntegerExpr::Fold(FoldingContext &context) +auto Expr>::Fold(FoldingContext &context) -> std::optional> { return std::visit( [&](auto &x) -> std::optional> { @@ -399,7 +407,7 @@ auto IntegerExpr::Fold(FoldingContext &context) } template -auto RealExpr::ConvertInteger::FoldScalar( +auto Expr>::ConvertInteger::FoldScalar( FoldingContext &context, const SomeKindScalar &c) -> std::optional> { return std::visit( @@ -412,7 +420,7 @@ auto RealExpr::ConvertInteger::FoldScalar( } template -auto RealExpr::ConvertReal::FoldScalar( +auto Expr>::ConvertReal::FoldScalar( FoldingContext &context, const SomeKindScalar &c) -> std::optional> { return std::visit( @@ -425,13 +433,14 @@ auto RealExpr::ConvertReal::FoldScalar( } template -auto RealExpr::Negate::FoldScalar(FoldingContext &context, - const Scalar &c) -> std::optional> { +auto Expr>::Negate::FoldScalar( + FoldingContext &context, const Scalar &c) + -> std::optional> { return {c.Negate()}; } template -auto RealExpr::Add::FoldScalar( +auto Expr>::Add::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto sum{a.Add(b, context.rounding)}; @@ -440,7 +449,7 @@ auto RealExpr::Add::FoldScalar( } template -auto RealExpr::Subtract::FoldScalar( +auto Expr>::Subtract::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto difference{a.Subtract(b, context.rounding)}; @@ -449,7 +458,7 @@ auto RealExpr::Subtract::FoldScalar( } template -auto RealExpr::Multiply::FoldScalar( +auto Expr>::Multiply::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto product{a.Multiply(b, context.rounding)}; @@ -458,7 +467,7 @@ auto RealExpr::Multiply::FoldScalar( } template -auto RealExpr::Divide::FoldScalar( +auto Expr>::Divide::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto quotient{a.Divide(b, context.rounding)}; @@ -467,15 +476,16 @@ auto RealExpr::Divide::FoldScalar( } template -auto RealExpr::Power::FoldScalar( +auto Expr>::Power::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { return std::nullopt; // TODO } template -auto RealExpr::IntPower::FoldScalar(FoldingContext &context, - const Scalar &a, const SomeKindScalar &b) +auto Expr>::IntPower::FoldScalar( + FoldingContext &context, const Scalar &a, + const SomeKindScalar &b) -> std::optional> { return std::visit( [&](const auto &pow) -> std::optional> { @@ -487,7 +497,7 @@ auto RealExpr::IntPower::FoldScalar(FoldingContext &context, } template -auto RealExpr::Max::FoldScalar( +auto Expr>::Max::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { if (b.IsNotANumber() || a.Compare(b) == Relation::Less) { @@ -497,7 +507,7 @@ auto RealExpr::Max::FoldScalar( } template -auto RealExpr::Min::FoldScalar( +auto Expr>::Min::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { if (b.IsNotANumber() || a.Compare(b) == Relation::Greater) { @@ -507,21 +517,23 @@ auto RealExpr::Min::FoldScalar( } template -auto RealExpr::RealPart::FoldScalar(FoldingContext &context, +auto Expr>::RealPart::FoldScalar( + FoldingContext &context, const Scalar> &z) -> std::optional> { return {z.REAL()}; } template -auto RealExpr::AIMAG::FoldScalar(FoldingContext &context, +auto Expr>::AIMAG::FoldScalar( + FoldingContext &context, const Scalar> &z) -> std::optional> { return {z.AIMAG()}; } template -auto RealExpr::Fold(FoldingContext &context) +auto Expr>::Fold(FoldingContext &context) -> std::optional> { return std::visit( [&](auto &x) -> std::optional> { @@ -545,13 +557,14 @@ auto RealExpr::Fold(FoldingContext &context) } template -auto ComplexExpr::Negate::FoldScalar(FoldingContext &context, - const Scalar &c) -> std::optional> { +auto Expr>::Negate::FoldScalar( + FoldingContext &context, const Scalar &c) + -> std::optional> { return {c.Negate()}; } template -auto ComplexExpr::Add::FoldScalar( +auto Expr>::Add::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto sum{a.Add(b, context.rounding)}; @@ -560,7 +573,7 @@ auto ComplexExpr::Add::FoldScalar( } template -auto ComplexExpr::Subtract::FoldScalar( +auto Expr>::Subtract::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto difference{a.Subtract(b, context.rounding)}; @@ -569,7 +582,7 @@ auto ComplexExpr::Subtract::FoldScalar( } template -auto ComplexExpr::Multiply::FoldScalar( +auto Expr>::Multiply::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto product{a.Multiply(b, context.rounding)}; @@ -578,7 +591,7 @@ auto ComplexExpr::Multiply::FoldScalar( } template -auto ComplexExpr::Divide::FoldScalar( +auto Expr>::Divide::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { auto quotient{a.Divide(b, context.rounding)}; @@ -587,15 +600,16 @@ auto ComplexExpr::Divide::FoldScalar( } template -auto ComplexExpr::Power::FoldScalar( +auto Expr>::Power::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { return std::nullopt; // TODO } template -auto ComplexExpr::IntPower::FoldScalar(FoldingContext &context, - const Scalar &a, const SomeKindScalar &b) +auto Expr>::IntPower::FoldScalar( + FoldingContext &context, const Scalar &a, + const SomeKindScalar &b) -> std::optional> { return std::visit( [&](const auto &pow) -> std::optional> { @@ -607,7 +621,8 @@ auto ComplexExpr::IntPower::FoldScalar(FoldingContext &context, } template -auto ComplexExpr::CMPLX::FoldScalar(FoldingContext &context, +auto Expr>::CMPLX::FoldScalar( + FoldingContext &context, const Scalar> &a, const Scalar> &b) -> std::optional> { @@ -615,7 +630,7 @@ auto ComplexExpr::CMPLX::FoldScalar(FoldingContext &context, } template -auto ComplexExpr::Fold(FoldingContext &context) +auto Expr>::Fold(FoldingContext &context) -> std::optional> { return std::visit( [&](auto &x) -> std::optional> { @@ -639,7 +654,7 @@ auto ComplexExpr::Fold(FoldingContext &context) } template -auto CharacterExpr::Concat::FoldScalar( +auto Expr>::Concat::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { if constexpr (KIND == 1) { @@ -649,7 +664,7 @@ auto CharacterExpr::Concat::FoldScalar( } template -auto CharacterExpr::Max::FoldScalar( +auto Expr>::Max::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { if (Compare(a, b) == Ordering::Less) { @@ -659,7 +674,7 @@ auto CharacterExpr::Max::FoldScalar( } template -auto CharacterExpr::Min::FoldScalar( +auto Expr>::Min::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { if (Compare(a, b) == Ordering::Greater) { @@ -669,7 +684,7 @@ auto CharacterExpr::Min::FoldScalar( } template -auto CharacterExpr::Fold(FoldingContext &context) +auto Expr>::Fold(FoldingContext &context) -> std::optional> { return std::visit( [&](auto &x) -> std::optional> { @@ -741,41 +756,42 @@ auto Comparison::FoldScalar(FoldingContext &c, const Scalar &a, } template -auto LogicalExpr::Not::FoldScalar(FoldingContext &context, - const Scalar &x) -> std::optional> { +auto Expr>::Not::FoldScalar( + FoldingContext &context, const Scalar &x) + -> std::optional> { return {Scalar{!x.IsTrue()}}; } template -auto LogicalExpr::And::FoldScalar( +auto Expr>::And::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { return {Scalar{a.IsTrue() && b.IsTrue()}}; } template -auto LogicalExpr::Or::FoldScalar( +auto Expr>::Or::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { return {Scalar{a.IsTrue() || b.IsTrue()}}; } template -auto LogicalExpr::Eqv::FoldScalar( +auto Expr>::Eqv::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { return {Scalar{a.IsTrue() == b.IsTrue()}}; } template -auto LogicalExpr::Neqv::FoldScalar( +auto Expr>::Neqv::FoldScalar( FoldingContext &context, const Scalar &a, const Scalar &b) -> std::optional> { return {Scalar{a.IsTrue() != b.IsTrue()}}; } template -auto LogicalExpr::Fold(FoldingContext &context) +auto Expr>::Fold(FoldingContext &context) -> std::optional> { return std::visit( [&](auto &x) -> std::optional> { diff --git a/flang/lib/evaluate/expression.h b/flang/lib/evaluate/expression.h index 5b5d87f..4a45de1 100644 --- a/flang/lib/evaluate/expression.h +++ b/flang/lib/evaluate/expression.h @@ -22,7 +22,6 @@ // and manipulation in place. #include "common.h" -#include "expression-forward.h" #include "type.h" #include "variable.h" #include "../lib/common/idioms.h" @@ -33,6 +32,16 @@ namespace Fortran::evaluate { +template class Expr; + +// An expression whose result is within one particular type category and +// of any supported kind. +using SomeKindIntegerExpr = Expr>; +using SomeKindRealExpr = Expr>; +using SomeKindComplexExpr = Expr>; +using SomeKindCharacterExpr = Expr>; +using SomeKindLogicalExpr = Expr>; + // Helper base classes for packaging subexpressions. template class Unary { public: @@ -160,16 +169,19 @@ public: Expr(const SomeKindIntegerExpr &x) : u_{ConvertInteger{x}} {} Expr(SomeKindIntegerExpr &&x) : u_{ConvertInteger{std::move(x)}} {} template - Expr(const IntegerExpr &x) : u_{ConvertInteger{SomeKindIntegerExpr{x}}} {} + Expr(const Expr> &x) + : u_{ConvertInteger{SomeKindIntegerExpr{x}}} {} template - Expr(IntegerExpr &&x) + Expr(Expr> &&x) : u_{ConvertInteger{SomeKindIntegerExpr{std::move(x)}}} {} Expr(const SomeKindRealExpr &x) : u_{ConvertReal{x}} {} Expr(SomeKindRealExpr &&x) : u_{ConvertReal{std::move(x)}} {} template - Expr(const RealExpr &x) : u_{ConvertReal{SomeKindRealExpr{x}}} {} + Expr(const Expr> &x) + : u_{ConvertReal{SomeKindRealExpr{x}}} {} template - Expr(RealExpr &&x) : u_{ConvertReal{SomeKindRealExpr{std::move(x)}}} {} + Expr(Expr> &&x) + : u_{ConvertReal{SomeKindRealExpr{std::move(x)}}} {} template Expr(const A &x) : u_{x} {} template Expr(std::enable_if_t && @@ -285,16 +297,19 @@ public: Expr(const SomeKindIntegerExpr &x) : u_{ConvertInteger{x}} {} Expr(SomeKindIntegerExpr &&x) : u_{ConvertInteger{std::move(x)}} {} template - Expr(const IntegerExpr &x) : u_{ConvertInteger{SomeKindIntegerExpr{x}}} {} + Expr(const Expr> &x) + : u_{ConvertInteger{SomeKindIntegerExpr{x}}} {} template - Expr(IntegerExpr &&x) + Expr(Expr> &&x) : u_{ConvertInteger{SomeKindIntegerExpr{std::move(x)}}} {} Expr(const SomeKindRealExpr &x) : u_{ConvertReal{x}} {} Expr(SomeKindRealExpr &&x) : u_{ConvertReal{std::move(x)}} {} template - Expr(const RealExpr &x) : u_{ConvertReal{SomeKindRealExpr{x}}} {} + Expr(const Expr> &x) + : u_{ConvertReal{SomeKindRealExpr{x}}} {} template - Expr(RealExpr &&x) : u_{ConvertReal{SomeKindRealExpr{std::move(x)}}} {} + Expr(Expr> &&x) + : u_{ConvertReal{SomeKindRealExpr{std::move(x)}}} {} template Expr(const A &x) : u_{x} {} template Expr(std::enable_if_t, A> &&x) : u_{std::move(x)} {} @@ -659,21 +674,21 @@ BINARY(Power, Power) #undef BINARY #define BINARY(FUNC, OP) \ - template LogicalExpr<1> FUNC(const A &x, const A &y) { \ + template Expr FUNC(const A &x, const A &y) { \ return {Comparison>{OP, x, y}}; \ } \ template \ - std::enable_if_t, LogicalExpr<1>> FUNC( \ + std::enable_if_t, Expr> FUNC( \ const A &x, A &&y) { \ return {Comparison>{OP, x, std::move(y)}}; \ } \ template \ - std::enable_if_t, LogicalExpr<1>> FUNC( \ + std::enable_if_t, Expr> FUNC( \ A &&x, const A &y) { \ return {Comparison>{OP, std::move(x), y}}; \ } \ template \ - std::enable_if_t, LogicalExpr<1>> FUNC( \ + std::enable_if_t, Expr> FUNC( \ A &&x, A &&y) { \ return {Comparison>{OP, std::move(x), std::move(y)}}; \ } diff --git a/flang/lib/evaluate/type.h b/flang/lib/evaluate/type.h index c3816fc..a5f528b 100644 --- a/flang/lib/evaluate/type.h +++ b/flang/lib/evaluate/type.h @@ -238,5 +238,6 @@ template struct SomeKind { static constexpr TypeCategory category{CAT}; using Scalar = SomeKindScalar; }; + } // namespace Fortran::evaluate #endif // FORTRAN_EVALUATE_TYPE_H_ diff --git a/flang/lib/evaluate/variable.h b/flang/lib/evaluate/variable.h index 535a26c..fa9396f 100644 --- a/flang/lib/evaluate/variable.h +++ b/flang/lib/evaluate/variable.h @@ -22,8 +22,8 @@ // that only admissable combinations can be constructed. #include "common.h" -#include "expression-forward.h" #include "intrinsics.h" +#include "type.h" #include "../common/idioms.h" #include "../semantics/symbol.h" #include @@ -36,6 +36,7 @@ namespace Fortran::evaluate { using semantics::Symbol; // Forward declarations +template class Expr; class DataRef; class Variable; class ActualFunctionArg; diff --git a/flang/lib/semantics/expression.cc b/flang/lib/semantics/expression.cc index 4679fb6..de74add 100644 --- a/flang/lib/semantics/expression.cc +++ b/flang/lib/semantics/expression.cc @@ -23,6 +23,8 @@ using namespace Fortran::parser::literals; namespace Fortran::semantics { +using common::TypeCategory; + // AnalyzeHelper is a local template function that keeps the API // member function ExpressionAnalyzer::Analyze from having to be a // many-specialized template itself. @@ -96,9 +98,11 @@ static std::optional AnalyzeLiteral( ExpressionAnalyzer::KindParam{1})}; switch (kind) { #define CASE(k) \ - case k: \ + case k: { \ + using Ty = evaluate::Type; \ return {evaluate::SomeKindCharacterExpr{ \ - evaluate::CharacterExpr{std::get(x.t)}}}; + evaluate::Expr{std::get(x.t)}}}; \ + } FOR_EACH_CHARACTER_KIND(CASE, ) #undef CASE default: @@ -153,7 +157,7 @@ MaybeExpr AnalyzeHelper( } evaluate::Substring substring{std::move(str), std::move(lb), std::move(ub)}; evaluate::CopyableIndirection ind{std::move(substring)}; - evaluate::CharacterExpr<1> chExpr{std::move(ind)}; + evaluate::Expr chExpr{std::move(ind)}; chExpr.Fold(ea.context()); return {GenericExpr{evaluate::SomeKindCharacterExpr{std::move(chExpr)}}}; } @@ -167,7 +171,10 @@ std::optional IntLiteralConstant( auto value{std::get<0>(x.t)}; // std::[u]int64_t switch (kind) { #define CASE(k) \ - case k: return {evaluate::ToSomeKindExpr(evaluate::IntegerExpr{value})}; + case k: { \ + using Ty = evaluate::Type; \ + return {evaluate::ToSomeKindExpr(evaluate::Expr{value})}; \ + } FOR_EACH_INTEGER_KIND(CASE, ) #undef CASE default: @@ -216,7 +223,7 @@ template std::optional ReadRealLiteral( parser::CharBlock source, evaluate::FoldingContext &context) { const char *p{source.begin()}; - using RealType = evaluate::Type; + using RealType = evaluate::Type; auto valWithFlags{evaluate::Scalar::Read(p, context.rounding)}; CHECK(p == source.end()); evaluate::RealFlagWarnings( @@ -333,8 +340,10 @@ static std::optional AnalyzeLiteral( bool value{std::get(x.t)}; switch (kind) { #define CASE(k) \ - case k: \ - return {evaluate::SomeKindLogicalExpr{evaluate::LogicalExpr{value}}}; + case k: { \ + using Ty = evaluate::Type; \ + return {evaluate::SomeKindLogicalExpr{evaluate::Expr{value}}}; \ + } FOR_EACH_LOGICAL_KIND(CASE, ) #undef CASE default: @@ -602,8 +611,7 @@ ExpressionAnalyzer::ConstructComplex(MaybeExpr &&real, MaybeExpr &&imaginary) { return {std::visit( [](auto &&rx, auto &&ix) -> evaluate::SomeKindComplexExpr { using realType = evaluate::ResultType; - using zType = - evaluate::SameKind; + using zType = evaluate::SameKind; using zExpr = evaluate::Expr; return {zExpr{typename zExpr::CMPLX{std::move(rx), std::move(ix)}}}; }, diff --git a/flang/test/evaluate/expression.cc b/flang/test/evaluate/expression.cc index 5ed02a3..d4d727f 100644 --- a/flang/test/evaluate/expression.cc +++ b/flang/test/evaluate/expression.cc @@ -29,6 +29,7 @@ template std::string Dump(const A &x) { } int main() { + using DefaultIntegerExpr = Expr; TEST(DefaultIntegerExpr::Result::Dump() == "Integer(4)"); MATCH("666", Dump(DefaultIntegerExpr{666})); MATCH("(-1)", Dump(-DefaultIntegerExpr{1})); -- 2.7.4