From: peter klausler Date: Tue, 5 Mar 2019 20:28:08 +0000 (-0800) Subject: [flang] Use value()/has_value() on Indirection class templates instead of operator... X-Git-Tag: llvmorg-12-init~9537^2~1678 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6a0f9474ff71bd17299ddfd399eb12938ef49c63;p=platform%2Fupstream%2Fllvm.git [flang] Use value()/has_value() on Indirection class templates instead of operator*/operator-> Original-commit: flang-compiler/f18@a97f377ae6051d877df82036983cc6209a2e0d95 Reviewed-on: https://github.com/flang-compiler/f18/pull/311 Tree-same-pre-rewrite: false --- diff --git a/flang/lib/common/indirection.h b/flang/lib/common/indirection.h index a04404f..c35f10f 100644 --- a/flang/lib/common/indirection.h +++ b/flang/lib/common/indirection.h @@ -65,10 +65,6 @@ public: A &value() { return *p_; } const A &value() const { return *p_; } - A &operator*() { return *p_; } - const A &operator*() const { return *p_; } - A *operator->() { return p_; } - const A *operator->() const { return p_; } bool operator==(const A &x) const { return *p_ == x; } bool operator==(const Indirection &that) const { return *p_ == *that.p_; } @@ -120,10 +116,6 @@ public: A &value() { return *p_; } const A &value() const { return *p_; } - A &operator*() { return *p_; } - const A &operator*() const { return *p_; } - A *operator->() { return p_; } - const A *operator->() const { return p_; } bool operator==(const A &x) const { return *p_ == x; } bool operator==(const Indirection &that) const { return *p_ == *that.p_; } @@ -168,12 +160,15 @@ public: return *this = OwningPointer(std::move(p)); } - A &operator*() { return *p_; } - const A &operator*() const { return *p_; } - A *operator->() { return p_; } - const A *operator->() const { return p_; } - - A *get() const { return p_; } + bool has_value() const { return p_ != nullptr; } + A &value() { + CHECK(p_ != nullptr); + return *p_; + } + const A &value() const { + CHECK(p_ != nullptr); + return *p_; + } bool operator==(const A &x) const { return p_ != nullptr && *p_ == x; } bool operator==(const OwningPointer &that) const { @@ -224,11 +219,6 @@ public: return *this = ForwardReference(std::move(p)); } - A &operator*() { return *p_; } - const A &operator*() const { return *p_; } - A *operator->() { return p_; } - const A *operator->() const { return p_; } - A &value() { return *p_; } const A &value() const { return *p_; } diff --git a/flang/lib/evaluate/call.cc b/flang/lib/evaluate/call.cc index b4c7de4..aefb901 100644 --- a/flang/lib/evaluate/call.cc +++ b/flang/lib/evaluate/call.cc @@ -19,14 +19,14 @@ namespace Fortran::evaluate { std::optional ActualArgument::GetType() const { - return value->GetType(); + return value().GetType(); } -int ActualArgument::Rank() const { return value->Rank(); } +int ActualArgument::Rank() const { return value().Rank(); } bool ActualArgument::operator==(const ActualArgument &that) const { return keyword == that.keyword && - isAlternateReturn == that.isAlternateReturn && value == that.value; + isAlternateReturn == that.isAlternateReturn && value() == that.value(); } std::ostream &ActualArgument::AsFortran(std::ostream &o) const { @@ -36,7 +36,7 @@ std::ostream &ActualArgument::AsFortran(std::ostream &o) const { if (isAlternateReturn) { o << '*'; } - return value->AsFortran(o); + return value().AsFortran(o); } std::optional ActualArgument::VectorSize() const { diff --git a/flang/lib/evaluate/call.h b/flang/lib/evaluate/call.h index 8f0ea85..b0b39f8 100644 --- a/flang/lib/evaluate/call.h +++ b/flang/lib/evaluate/call.h @@ -31,10 +31,14 @@ class Symbol; namespace Fortran::evaluate { -struct ActualArgument { - explicit ActualArgument(Expr &&x) : value{std::move(x)} {} +class ActualArgument { +public: + explicit ActualArgument(Expr &&x) : value_{std::move(x)} {} explicit ActualArgument(CopyableIndirection> &&v) - : value{std::move(v)} {} + : value_{std::move(v)} {} + + Expr &value() { return value_.value(); } + const Expr &value() const { return value_.value(); } std::optional GetType() const; int Rank() const; @@ -47,12 +51,13 @@ struct ActualArgument { // TODO: Mark legacy %VAL and %REF arguments +private: // Subtlety: There is a distinction that must be maintained here between an // actual argument expression that is a variable and one that is not, // e.g. between X and (X). The parser attempts to parse each argument // first as a variable, then as an expression, and the distinction appears // in the parse tree. - CopyableIndirection> value; + CopyableIndirection> value_; }; using ActualArguments = std::vector>; diff --git a/flang/lib/evaluate/characteristics.cc b/flang/lib/evaluate/characteristics.cc index b44f98e..79dad84 100644 --- a/flang/lib/evaluate/characteristics.cc +++ b/flang/lib/evaluate/characteristics.cc @@ -61,8 +61,8 @@ bool DummyProcedure::operator==(const DummyProcedure &that) const { std::ostream &DummyProcedure::Dump(std::ostream &o) const { attrs.Dump(o, EnumToString); - if (explicitProcedure.get() != nullptr) { - explicitProcedure->Dump(o); + if (explicitProcedure.has_value()) { + explicitProcedure.value().Dump(o); } return o; } diff --git a/flang/lib/evaluate/expression.cc b/flang/lib/evaluate/expression.cc index 857d876..0f4f068 100644 --- a/flang/lib/evaluate/expression.cc +++ b/flang/lib/evaluate/expression.cc @@ -87,7 +87,7 @@ std::ostream &LogicalOperation::Infix(std::ostream &o) const { template std::ostream &Emit(std::ostream &o, const CopyableIndirection> &expr) { - return expr->AsFortran(o); + return expr.value().AsFortran(o); } template @@ -96,12 +96,12 @@ std::ostream &Emit(std::ostream &, const ArrayConstructorValues &); template std::ostream &Emit(std::ostream &o, const ImpliedDo &implDo) { o << '('; - Emit(o, *implDo.values); + Emit(o, implDo.values()); o << ',' << ImpliedDoIndex::Result::AsFortran() - << "::" << implDo.name.ToString() << '='; - implDo.lower->AsFortran(o) << ','; - implDo.upper->AsFortran(o) << ','; - implDo.stride->AsFortran(o) << ')'; + << "::" << implDo.name().ToString() << '='; + implDo.lower().AsFortran(o) << ','; + implDo.upper().AsFortran(o) << ','; + implDo.stride().AsFortran(o) << ')'; return o; } @@ -147,7 +147,9 @@ std::ostream &ExpressionBase::AsFortran(std::ostream &o) const { o << "z'" << x.Hexadecimal() << "'"; }, [&](const NullPointer &) { o << "NULL()"; }, - [&](const CopyableIndirection &s) { s->AsFortran(o); }, + [&](const CopyableIndirection &s) { + s.value().AsFortran(o); + }, [&](const ImpliedDoIndex &i) { o << i.name.ToString(); }, [&](const auto &x) { x.AsFortran(o); }, }, @@ -235,8 +237,9 @@ bool ImpliedDoIndex::operator==(const ImpliedDoIndex &that) const { template bool ImpliedDo::operator==(const ImpliedDo &that) const { - return name == that.name && lower == that.lower && upper == that.upper && - stride == that.stride && values == that.values; + return name_ == that.name_ && lower_ == that.lower_ && + upper_ == that.upper_ && stride_ == that.stride_ && + values_ == that.values_; } template @@ -288,7 +291,7 @@ std::ostream &StructureConstructor::AsFortran(std::ostream &o) const { } else { char ch{'('}; for (const auto &[symbol, value] : values_) { - value->AsFortran(o << ch << symbol->name().ToString() << '='); + value.value().AsFortran(o << ch << symbol->name().ToString() << '='); ch = ','; } } diff --git a/flang/lib/evaluate/expression.h b/flang/lib/evaluate/expression.h index 9367766..b904e72 100644 --- a/flang/lib/evaluate/expression.h +++ b/flang/lib/evaluate/expression.h @@ -145,17 +145,17 @@ public: template Expr> &operand() { if constexpr (operands == 1) { static_assert(J == 0); - return *operand_; + return operand_.value(); } else { - return *std::get(operand_); + return std::get(operand_).value(); } } template const Expr> &operand() const { if constexpr (operands == 1) { static_assert(J == 0); - return *operand_; + return operand_.value(); } else { - return *std::get(operand_); + return std::get(operand_).value(); } } @@ -413,12 +413,32 @@ struct ImpliedDoIndex { parser::CharBlock name; // nested implied DOs must use distinct names }; -template struct ImpliedDo { +template class ImpliedDo { +public: using Result = RESULT; + using Index = ResultType; + ImpliedDo(parser::CharBlock name, Expr &&lower, Expr &&upper, + Expr &&stride, ArrayConstructorValues &&values) + : name_{name}, lower_{std::move(lower)}, upper_{std::move(upper)}, + stride_{std::move(stride)}, values_{std::move(values)} {} + DEFAULT_CONSTRUCTORS_AND_ASSIGNMENTS(ImpliedDo) bool operator==(const ImpliedDo &) const; - parser::CharBlock name; - CopyableIndirection>> lower, upper, stride; - CopyableIndirection> values; + parser::CharBlock name() const { return name_; } + Expr &lower() { return lower_.value(); } + const Expr &lower() const { return lower_.value(); } + Expr &upper() { return upper_.value(); } + const Expr &upper() const { return upper_.value(); } + Expr &stride() { return stride_.value(); } + const Expr &stride() const { return stride_.value(); } + ArrayConstructorValues &values() { return values_.value(); } + const ArrayConstructorValues &values() const { + return values_.value(); + } + +private: + parser::CharBlock name_; + CopyableIndirection> lower_, upper_, stride_; + CopyableIndirection> values_; }; template struct ArrayConstructorValue { @@ -466,7 +486,7 @@ public: bool operator==(const ArrayConstructor &) const; static constexpr DynamicType GetType() { return Result::GetType(); } std::ostream &AsFortran(std::ostream &) const; - const Expr &LEN() const { return *length_; } + const Expr &LEN() const { return length_.value(); } private: CopyableIndirection> length_; diff --git a/flang/lib/evaluate/fold.cc b/flang/lib/evaluate/fold.cc index b9241fe..491313d 100644 --- a/flang/lib/evaluate/fold.cc +++ b/flang/lib/evaluate/fold.cc @@ -79,7 +79,7 @@ Subscript FoldOperation(FoldingContext &context, Subscript &&subscript) { return std::visit( common::visitors{ [&](IndirectSubscriptIntegerExpr &&expr) { - *expr = Fold(context, std::move(*expr)); + expr.value() = Fold(context, std::move(expr.value())); return Subscript(std::move(expr)); }, [&](Triplet &&triplet) { @@ -161,20 +161,21 @@ Expr FoldOperation(FoldingContext &context, FunctionRef &&funcRef) { ActualArguments args{std::move(funcRef.arguments())}; for (std::optional &arg : args) { if (arg.has_value()) { - *arg->value = FoldOperation(context, std::move(*arg->value)); + arg.value().value() = + FoldOperation(context, std::move(arg.value().value())); } } if (auto *intrinsic{std::get_if(&funcRef.proc().u)}) { std::string name{intrinsic->name}; if (name == "kind") { if constexpr (common::HasMember) { - return Expr{args[0]->value->GetType()->kind}; + return Expr{args[0].value().GetType()->kind}; } else { common::die("kind() result not integral"); } } else if (name == "len") { if constexpr (std::is_same_v) { - if (auto *charExpr{UnwrapExpr>(*args[0]->value)}) { + if (auto *charExpr{UnwrapExpr>(args[0].value())}) { return std::visit([](auto &kx) { return kx.LEN(); }, charExpr->u); } } else { @@ -250,7 +251,7 @@ public: private: bool FoldArray(const CopyableIndirection> &expr) { - Expr folded{Fold(context_, common::Clone(*expr))}; + Expr folded{Fold(context_, common::Clone(expr.value()))}; if (auto *c{UnwrapExpr>(folded)}) { // Copy elements in Fortran array element order std::vector shape{c->shape()}; @@ -276,20 +277,20 @@ private: } bool FoldArray(const ImpliedDo &iDo) { Expr lower{ - Fold(context_, Expr{*iDo.lower})}; + Fold(context_, Expr{iDo.lower()})}; Expr upper{ - Fold(context_, Expr{*iDo.upper})}; + Fold(context_, Expr{iDo.upper()})}; Expr stride{ - Fold(context_, Expr{*iDo.stride})}; + Fold(context_, Expr{iDo.stride()})}; std::optional start{ToInt64(lower)}, end{ToInt64(upper)}, step{ToInt64(stride)}; if (start.has_value() && end.has_value() && step.has_value()) { bool result{true}; - for (std::int64_t &j{context_.StartImpliedDo(iDo.name, *start)}; + for (std::int64_t &j{context_.StartImpliedDo(iDo.name(), *start)}; j <= *end; j += *step) { - result &= FoldArray(*iDo.values); + result &= FoldArray(iDo.values()); } - context_.EndImpliedDo(iDo.name); + context_.EndImpliedDo(iDo.name()); return result; } else { return false; @@ -322,7 +323,7 @@ Expr FoldOperation( FoldingContext &context, StructureConstructor &&structure) { StructureConstructor result{structure.derivedTypeSpec()}; for (auto &&[symbol, value] : std::move(structure.values())) { - result.Add(*symbol, Fold(context, std::move(*value))); + result.Add(*symbol, Fold(context, std::move(value.value()))); } return Expr{Constant{result}}; } @@ -882,14 +883,14 @@ bool IsConstExpr( } template bool IsConstExpr(ConstExprContext &context, const ImpliedDo &impliedDo) { - if (!IsConstExpr(context, impliedDo.lower) || - !IsConstExpr(context, impliedDo.upper) || - !IsConstExpr(context, impliedDo.stride)) { + if (!IsConstExpr(context, impliedDo.lower()) || + !IsConstExpr(context, impliedDo.upper()) || + !IsConstExpr(context, impliedDo.stride())) { return false; } ConstExprContext newContext{context}; - newContext.constantNames.insert(impliedDo.name); - return IsConstExpr(newContext, impliedDo.values); + newContext.constantNames.insert(impliedDo.name()); + return IsConstExpr(newContext, impliedDo.values()); } template bool IsConstExpr( @@ -967,7 +968,7 @@ bool IsConstExpr(ConstExprContext &context, const Designator &designator) { return IsConstExpr(context, designator.u); } bool IsConstExpr(ConstExprContext &context, const ActualArgument &arg) { - return IsConstExpr(context, *arg.value); + return IsConstExpr(context, arg.value()); } template bool IsConstExpr(ConstExprContext &context, const FunctionRef &funcRef) { @@ -987,7 +988,7 @@ bool IsConstExpr(ConstExprContext &context, const Expr &expr) { } template bool IsConstExpr(ConstExprContext &context, const CopyableIndirection &x) { - return IsConstExpr(context, *x); + return IsConstExpr(context, x.value()); } template bool IsConstExpr(ConstExprContext &context, const std::optional &maybe) { diff --git a/flang/lib/evaluate/intrinsics.cc b/flang/lib/evaluate/intrinsics.cc index 6f9be43..b645385 100644 --- a/flang/lib/evaluate/intrinsics.cc +++ b/flang/lib/evaluate/intrinsics.cc @@ -944,7 +944,7 @@ std::optional IntrinsicInterface::Match( for (std::size_t j{0}; j < dummies; ++j) { const IntrinsicDummyArgument &d{dummy[std::min(j, dummyArgPatterns - 1)]}; if (const ActualArgument * arg{actualForDummy[j]}) { - if (IsAssumedRank(*arg->value) && d.rank != Rank::anyOrAssumedRank) { + if (IsAssumedRank(arg->value()) && d.rank != Rank::anyOrAssumedRank) { messages.Say("assumed-rank array cannot be forwarded to " "'%s=' argument"_err_en_US, d.keyword); @@ -1069,7 +1069,7 @@ std::optional IntrinsicInterface::Match( CHECK(kindDummyArg != nullptr); CHECK(result.categorySet == CategorySet{resultType->category}); if (kindArg != nullptr) { - auto &expr{*kindArg->value}; + auto &expr{kindArg->value()}; CHECK(expr.Rank() == 0); if (auto code{ToInt64(expr)}) { if (IsValidKindOfIntrinsicType(resultType->category, *code)) { @@ -1263,7 +1263,7 @@ std::optional IntrinsicProcTable::Implementation::Probe( genericErrors.Say("unknown argument '%s' to NULL()"_err_en_US, arguments[0]->keyword->ToString().data()); } else { - Expr &mold{*arguments[0]->value}; + Expr &mold{arguments[0]->value()}; if (IsPointerOrAllocatable(mold)) { return std::make_optional( SpecificIntrinsic{"null"s, mold.GetType(), mold.Rank(), diff --git a/flang/lib/evaluate/variable.cc b/flang/lib/evaluate/variable.cc index a931f5b..05fae73 100644 --- a/flang/lib/evaluate/variable.cc +++ b/flang/lib/evaluate/variable.cc @@ -45,22 +45,24 @@ Triplet::Triplet(std::optional> &&l, std::optional> Triplet::lower() const { if (lower_) { - return {**lower_}; + return {lower_.value().value()}; } return std::nullopt; } std::optional> Triplet::upper() const { if (upper_) { - return {**upper_}; + return {upper_.value().value()}; } return std::nullopt; } -const Expr &Triplet::stride() const { return *stride_; } +const Expr &Triplet::stride() const { + return stride_.value(); +} bool Triplet::IsStrideOne() const { - if (auto stride{ToInt64(*stride_)}) { + if (auto stride{ToInt64(stride_.value())}) { return stride == 1; } else { return false; @@ -77,7 +79,7 @@ CoarrayRef::CoarrayRef(std::vector &&c, std::optional> CoarrayRef::stat() const { if (stat_.has_value()) { - return {**stat_}; + return {stat_.value().value()}; } else { return std::nullopt; } @@ -85,7 +87,7 @@ std::optional> CoarrayRef::stat() const { std::optional> CoarrayRef::team() const { if (team_.has_value()) { - return {**team_}; + return {team_.value().value()}; } else { return std::nullopt; } @@ -107,16 +109,16 @@ CoarrayRef &CoarrayRef::set_team(Expr &&v, bool isTeamNumber) { void Substring::SetBounds(std::optional> &lower, std::optional> &upper) { if (lower.has_value()) { - lower_.emplace(std::move(*lower)); + lower_.emplace(std::move(lower.value())); } if (upper.has_value()) { - upper_.emplace(std::move(*upper)); + upper_.emplace(std::move(upper.value())); } } Expr Substring::lower() const { if (lower_.has_value()) { - return **lower_; + return lower_.value().value(); } else { return AsExpr(Constant{1}); } @@ -124,7 +126,7 @@ Expr Substring::lower() const { Expr Substring::upper() const { if (upper_.has_value()) { - return **upper_; + return upper_.value().value(); } else { return std::visit( common::visitors{ @@ -141,8 +143,8 @@ std::optional> Substring::Fold(FoldingContext &context) { if (!lower_.has_value()) { lower_ = AsExpr(Constant{1}); } - *lower_ = evaluate::Fold(context, std::move(**lower_)); - std::optional lbi{ToInt64(**lower_)}; + lower_.value() = evaluate::Fold(context, std::move(lower_.value().value())); + std::optional lbi{ToInt64(lower_.value().value())}; if (lbi.has_value() && *lbi < 1) { context.messages().Say( "lower bound (%jd) on substring is less than one"_en_US, @@ -153,8 +155,8 @@ std::optional> Substring::Fold(FoldingContext &context) { if (!upper_.has_value()) { upper_ = upper(); } - *upper_ = evaluate::Fold(context, std::move(**upper_)); - if (std::optional ubi{ToInt64(**upper_)}) { + upper_.value() = evaluate::Fold(context, std::move(upper_.value().value())); + if (std::optional ubi{ToInt64(upper_.value().value())}) { auto *literal{std::get_if(&parent_)}; std::optional length; if (literal != nullptr) { @@ -262,7 +264,7 @@ std::ostream &Emit(std::ostream &o, const CopyableIndirection &p, if (kw != nullptr) { o << kw; } - Emit(o, *p); + Emit(o, p.value()); return o; } @@ -298,14 +300,14 @@ std::ostream &TypeParamInquiry::AsFortran(std::ostream &o) const { } std::ostream &Component::AsFortran(std::ostream &o) const { - base_->AsFortran(o); + base_.value().AsFortran(o); return Emit(o << '%', *symbol_); } std::ostream &Triplet::AsFortran(std::ostream &o) const { Emit(o, lower_) << ':'; Emit(o, upper_); - Emit(o << ':', *stride_); + Emit(o << ':', stride_.value()); return o; } @@ -465,13 +467,15 @@ int Component::Rank() const { if (int rank{symbol_->Rank()}; rank > 0) { return rank; } - return base_->Rank(); + return base_.value().Rank(); } int Subscript::Rank() const { return std::visit( common::visitors{ - [](const IndirectSubscriptIntegerExpr &x) { return x->Rank(); }, + [](const IndirectSubscriptIntegerExpr &x) { + return x.value().Rank(); + }, [](const Triplet &) { return 1; }, }, u); @@ -538,7 +542,7 @@ template int Designator::Rank() const { // GetBaseObject(), GetFirstSymbol(), & GetLastSymbol() const Symbol &Component::GetFirstSymbol() const { - return base_->GetFirstSymbol(); + return base_.value().GetFirstSymbol(); } const Symbol &ArrayRef::GetFirstSymbol() const { @@ -658,7 +662,7 @@ bool TypeParamInquiry::operator==( } bool Triplet::operator==(const Triplet &that) const { return lower_ == that.lower_ && upper_ == that.upper_ && - *stride_ == *that.stride_; + stride_ == that.stride_; } bool ArrayRef::operator==(const ArrayRef &that) const { return base_ == that.base_ && subscript_ == that.subscript_; diff --git a/flang/lib/evaluate/variable.h b/flang/lib/evaluate/variable.h index c51fafc..ef280e1 100644 --- a/flang/lib/evaluate/variable.h +++ b/flang/lib/evaluate/variable.h @@ -80,8 +80,8 @@ public: Component(CopyableIndirection &&b, const Symbol &c) : base_{std::move(b)}, symbol_{&c} {} - const DataRef &base() const { return *base_; } - DataRef &base() { return *base_; } + const DataRef &base() const { return base_.value(); } + DataRef &base() { return base_.value(); } int Rank() const; const Symbol &GetFirstSymbol() const; const Symbol &GetLastSymbol() const { return *symbol_; } diff --git a/flang/lib/parser/parse-tree-visitor.h b/flang/lib/parser/parse-tree-visitor.h index ae1181f..7c9e2ae 100644 --- a/flang/lib/parser/parse-tree-visitor.h +++ b/flang/lib/parser/parse-tree-visitor.h @@ -221,11 +221,11 @@ std::enable_if_t> Walk(A &x, M &mutator) { template void Walk(const common::Indirection &x, V &visitor) { - Walk(*x, visitor); + Walk(x.value(), visitor); } template void Walk(common::Indirection &x, M &mutator) { - Walk(*x, mutator); + Walk(x.value(), mutator); } // Walk a class with a single field 'thing'. diff --git a/flang/lib/parser/parse-tree.cc b/flang/lib/parser/parse-tree.cc index efa0ece..f4894fa 100644 --- a/flang/lib/parser/parse-tree.cc +++ b/flang/lib/parser/parse-tree.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +// Copyright (c) 2018-2019, 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. @@ -96,19 +96,19 @@ Designator FunctionReference::ConvertToArrayElementRef() { std::visit( common::visitors{ [&](common::Indirection &y) { - args.push_back(std::move(*y)); + args.push_back(std::move(y.value())); }, [&](common::Indirection &y) { args.push_back(std::visit( common::visitors{ [&](common::Indirection &z) { - return Expr{std::move(*z)}; + return Expr{std::move(z.value())}; }, [&](common::Indirection &z) { - return Expr{std::move(*z)}; + return Expr{std::move(z.value())}; }, }, - y->u)); + y.value().u)); }, [&](auto &) { CHECK(!"unexpected kind of ActualArg"); }, }, diff --git a/flang/lib/parser/user-state.cc b/flang/lib/parser/user-state.cc index a913a29..9b1e4b1 100644 --- a/flang/lib/parser/user-state.cc +++ b/flang/lib/parser/user-state.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +// Copyright (c) 2018-2019, 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. @@ -36,7 +36,7 @@ std::optional CapturedLabelDoStmt::Parse( auto result{parser.Parse(state)}; if (result) { if (auto *ustate{state.userState()}) { - ustate->NewDoLabel(std::get &x) { - Analyze(*x); + Analyze(x.value()); } template void Analyze(const std::variant &u) { std::visit([&](const auto &x) { Analyze(x); }, u); diff --git a/flang/lib/semantics/canonicalize-do.cc b/flang/lib/semantics/canonicalize-do.cc index 52cf6aa..3e3c382 100644 --- a/flang/lib/semantics/canonicalize-do.cc +++ b/flang/lib/semantics/canonicalize-do.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved. +// Copyright (c) 2018-2019, 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. @@ -34,7 +34,7 @@ public: common::visitors{ [](auto &) {}, [&](Statement> &labelDoStmt) { - auto &label{std::get &x) { - return AnalyzeExpr(context, *x); + return AnalyzeExpr(context, x.value()); } // These specializations implement constraint checking. diff --git a/flang/lib/semantics/mod-file.cc b/flang/lib/semantics/mod-file.cc index 1f0d38f..329ed8b 100644 --- a/flang/lib/semantics/mod-file.cc +++ b/flang/lib/semantics/mod-file.cc @@ -682,7 +682,8 @@ static const SourceName *GetSubmoduleParent(const parser::Program &program) { CHECK(program.v.size() == 1); auto &unit{program.v.front()}; auto &submod{std::get>(unit.u)}; - auto &stmt{std::get>(submod->t)}; + auto &stmt{ + std::get>(submod.value().t)}; auto &parentId{std::get(stmt.statement.t)}; if (auto &parent{std::get>(parentId.t)}) { return &parent->source; diff --git a/flang/lib/semantics/resolve-names.cc b/flang/lib/semantics/resolve-names.cc index 0340a06..a4f09c2 100644 --- a/flang/lib/semantics/resolve-names.cc +++ b/flang/lib/semantics/resolve-names.cc @@ -1762,7 +1762,7 @@ bool ModuleVisitor::Pre(const parser::Only &x) { [&](const parser::Name &name) { AddUse(name); }, [](const auto &) { common::die("TODO: GenericSpec"); }, }, - generic->u); + generic.value().u); }, [&](const parser::Name &name) { AddUse(name); }, [&](const parser::Rename &rename) { @@ -3241,7 +3241,7 @@ bool DeclarationVisitor::Pre(const parser::TypeBoundGenericStmt &x) { specificProcs.push_back(symbol); } } - const auto *genericName{GetGenericSpecName(*genericSpec)}; + const auto *genericName{GetGenericSpecName(genericSpec.value())}; if (!genericName) { return false; } @@ -3906,7 +3906,9 @@ bool ConstructVisitor::Pre(const parser::DataImpliedDo &x) { bool ConstructVisitor::Pre(const parser::DataStmtObject &x) { std::visit( common::visitors{ - [&](const common::Indirection &y) { Walk(*y); }, + [&](const common::Indirection &y) { + Walk(y.value()); + }, [&](const parser::DataImpliedDo &y) { PushScope(Scope::Kind::ImpliedDos, nullptr); Walk(y); @@ -3992,7 +3994,8 @@ void ConstructVisitor::Post(const parser::Selector &x) { [&](const parser::Variable &y) { if (const auto *des{ std::get_if>(&y.u)}) { - if (const auto *dr{std::get_if(&(*des)->u)}) { + if (const auto *dr{ + std::get_if(&des->value().u)}) { variable = std::get_if(&dr->u); if (variable && !FindSymbol(*variable)) { variable = nullptr; @@ -4236,13 +4239,13 @@ const parser::Name *ResolveNamesVisitor::ResolveDataRef( common::visitors{ [=](const parser::Name &y) { return ResolveName(y); }, [=](const Indirection &y) { - return ResolveStructureComponent(*y); + return ResolveStructureComponent(y.value()); }, [=](const Indirection &y) { - return ResolveArrayElement(*y); + return ResolveArrayElement(y.value()); }, [=](const Indirection &y) { - return ResolveCoindexedNamedObject(*y); + return ResolveCoindexedNamedObject(y.value()); }, }, x.u); @@ -4447,7 +4450,7 @@ bool ModuleVisitor::Pre(const parser::AccessStmt &x) { }, [](const auto &) { common::die("TODO: GenericSpec"); }, }, - y->u); + y.value().u); }, }, accessId.u); @@ -4594,7 +4597,7 @@ bool ResolveNamesVisitor::Pre(const parser::PointerAssignmentStmt &x) { }, [](const auto &) -> const parser::Name * { return nullptr; }, }, - (*designator)->u)}) { + designator->value().u)}) { return !NameIsKnownOrIntrinsic(*name); } } diff --git a/flang/lib/semantics/rewrite-parse-tree.cc b/flang/lib/semantics/rewrite-parse-tree.cc index 841ca5e..9193f17 100644 --- a/flang/lib/semantics/rewrite-parse-tree.cc +++ b/flang/lib/semantics/rewrite-parse-tree.cc @@ -73,12 +73,12 @@ private: return; } parser::Name *name{std::get_if( - &std::get((*funcRef)->v.t).u)}; + &std::get(funcRef->value().v.t).u)}; if (!name || !name->symbol || !name->symbol->GetUltimate().has()) { return; } - x.u = common::Indirection{(*funcRef)->ConvertToArrayElementRef()}; + x.u = common::Indirection{funcRef->value().ConvertToArrayElementRef()}; } }; @@ -95,7 +95,7 @@ void RewriteMutator::Post(parser::SpecificationPart &x) { auto &list{std::get>(x.t)}; for (auto it{list.begin()}; it != list.end();) { if (auto stmt{std::get_if(&it->u)}) { - Symbol *symbol{std::get(stmt->statement->t).symbol}; + Symbol *symbol{std::get(stmt->statement.value().t).symbol}; if (symbol && symbol->has()) { // not a stmt func: remove it here and add to ones to convert stmtFuncsToConvert_.push_back(std::move(*stmt)); @@ -111,7 +111,7 @@ void RewriteMutator::Post(parser::SpecificationPart &x) { bool RewriteMutator::Pre(parser::ExecutionPart &x) { auto origFirst{x.v.begin()}; // insert each elem before origFirst for (stmtFuncType &sf : stmtFuncsToConvert_) { - auto &&stmt = sf.statement->ConvertToAssignment(); + auto &&stmt = sf.statement.value().ConvertToAssignment(); stmt.source = sf.source; x.v.insert(origFirst, parser::ExecutionPartConstruct{parser::ExecutableConstruct{stmt}});