From 8057a2ce32828700579d52da063102425252cb12 Mon Sep 17 00:00:00 2001 From: peter klausler Date: Mon, 8 Apr 2019 16:16:55 -0700 Subject: [PATCH] [flang] Lots of debugging and refinement Original-commit: flang-compiler/f18@1c3c30b5401ff04550d2289b25bafe6229a4a2cc Reviewed-on: https://github.com/flang-compiler/f18/pull/390 Tree-same-pre-rewrite: false --- flang/lib/common/idioms.h | 6 ++++-- flang/lib/common/template.h | 6 ++++++ flang/lib/evaluate/common.h | 5 ++--- flang/lib/evaluate/constant.h | 6 +++--- flang/lib/evaluate/integer.h | 6 ++++-- flang/lib/evaluate/shape.cc | 4 ++-- flang/lib/evaluate/variable.h | 2 +- flang/lib/parser/message.cc | 7 ++++--- flang/lib/parser/message.h | 18 ++++++++---------- flang/lib/parser/parse-state.h | 14 ++++++-------- flang/lib/parser/parse-tree.cc | 8 +++++--- flang/lib/parser/prescan.h | 4 ++-- flang/lib/semantics/assignment.cc | 5 ++--- flang/lib/semantics/expression.h | 9 ++++----- flang/lib/semantics/resolve-names.cc | 24 +++++++++++++----------- flang/lib/semantics/rewrite-parse-tree.cc | 5 +++-- 16 files changed, 69 insertions(+), 60 deletions(-) diff --git a/flang/lib/common/idioms.h b/flang/lib/common/idioms.h index c72b2b9..cb098980 100644 --- a/flang/lib/common/idioms.h +++ b/flang/lib/common/idioms.h @@ -141,7 +141,9 @@ template A Clone(const A &x) { return x; } // confusing C++ reference forwarding semantics, e.g. // template void foo(A &&); // Works on parameter packs as well. -#define NOT_LVALUE_REFERENCE(X) bool = !std::is_lvalue_reference_v -#define NO_LVALUE_REFERENCE(X) bool = (... && !std::is_lvalue_reference_v) +#define NOT_LVALUE_REFERENCE(X) \ + typename = std::enable_if_t, int> +#define NO_LVALUE_REFERENCE(X) \ + typename = std::enable_if_t<(... && !std::is_lvalue_reference_v), int> } #endif // FORTRAN_COMMON_IDIOMS_H_ diff --git a/flang/lib/common/template.h b/flang/lib/common/template.h index 2c88bd4..8f5647c 100644 --- a/flang/lib/common/template.h +++ b/flang/lib/common/template.h @@ -111,6 +111,12 @@ std::optional JoinOptional(std::optional> &&x) { return std::nullopt; } +// Copy a value from one variant type to another. The types allowed in the +// source variant must all be allowed in the destination variant type. +template TOV CopyVariant(const FROMV &u) { + return std::visit([](const auto &x) -> TOV { return {x}; }, std::move(u)); +} + // Move a value from one variant type to another. The types allowed in the // source variant must all be allowed in the destination variant type. template diff --git a/flang/lib/evaluate/common.h b/flang/lib/evaluate/common.h index 63f9950..a8a778c 100644 --- a/flang/lib/evaluate/common.h +++ b/flang/lib/evaluate/common.h @@ -190,9 +190,8 @@ using HostUnsignedInt = #define EVALUATE_UNION_CLASS_BOILERPLATE(t) \ CLASS_BOILERPLATE(t) \ template explicit t(const _A &x) : u{x} {} \ - template \ - explicit t(std::enable_if_t, _A> &&x) \ - : u(std::move(x)) {} \ + template \ + explicit t(_A &&x) : u(std::move(x)) {} \ bool operator==(const t &that) const { return u == that.u; } // Forward definition of Expr<> so that it can be indirectly used in its own diff --git a/flang/lib/evaluate/constant.h b/flang/lib/evaluate/constant.h index 1858f1d..80757f3 100644 --- a/flang/lib/evaluate/constant.h +++ b/flang/lib/evaluate/constant.h @@ -43,11 +43,11 @@ public: using ScalarValue = SCALAR; template ConstantBase(const A &x) : values_{x} {} - template - ConstantBase(std::enable_if_t, A> &&x) - : values_{std::move(x)} {} + template + ConstantBase(A &&x) : values_{std::move(x)} {} ConstantBase(std::vector &&x, std::vector &&dims) : values_(std::move(x)), shape_(std::move(dims)) {} + DEFAULT_CONSTRUCTORS_AND_ASSIGNMENTS(ConstantBase) ~ConstantBase(); int Rank() const { return static_cast(shape_.size()); } diff --git a/flang/lib/evaluate/integer.h b/flang/lib/evaluate/integer.h index 834cf65..d1a5b6e 100644 --- a/flang/lib/evaluate/integer.h +++ b/flang/lib/evaluate/integer.h @@ -118,11 +118,13 @@ public: // Constructors and value-generating static functions constexpr Integer() { Clear(); } // default constructor: zero constexpr Integer(const Integer &) = default; + constexpr Integer(Integer &&) = default; // C++'s integral types can all be converted to Integer // with silent truncation. - template constexpr Integer(INT n) { - static_assert(std::is_integral_v); + template, int>> + constexpr Integer(INT n) { constexpr int nBits = CHAR_BIT * sizeof n; if constexpr (nBits < partBits) { if constexpr (std::is_unsigned_v) { diff --git a/flang/lib/evaluate/shape.cc b/flang/lib/evaluate/shape.cc index 9103a6b..3a9d182 100644 --- a/flang/lib/evaluate/shape.cc +++ b/flang/lib/evaluate/shape.cc @@ -39,8 +39,8 @@ std::optional AsShape(ExtentExpr &&arrayExpr) { } if (auto *constructor{UnwrapExpr>(arrayExpr)}) { Shape result; - for (const auto &value : constructor->values()) { - if (const auto *expr{std::get_if(&value.u)}) { + for (auto &value : constructor->values()) { + if (auto *expr{std::get_if(&value.u)}) { if (expr->Rank() == 0) { result.emplace_back(std::move(*expr)); continue; diff --git a/flang/lib/evaluate/variable.h b/flang/lib/evaluate/variable.h index 02b4d7d..9e193c4 100644 --- a/flang/lib/evaluate/variable.h +++ b/flang/lib/evaluate/variable.h @@ -348,7 +348,7 @@ public: static_assert(IsSpecificIntrinsicType || std::is_same_v>); EVALUATE_UNION_CLASS_BOILERPLATE(Designator) - Designator(const DataRef &that) : u{common::MoveVariant(that.u)} {} + Designator(const DataRef &that) : u{common::CopyVariant(that.u)} {} Designator(DataRef &&that) : u{common::MoveVariant(std::move(that.u))} {} diff --git a/flang/lib/parser/message.cc b/flang/lib/parser/message.cc index 9878637..d1a747e 100644 --- a/flang/lib/parser/message.cc +++ b/flang/lib/parser/message.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. @@ -292,9 +292,10 @@ void Messages::Emit( } void Messages::AttachTo(Message &msg) { - for (const Message &m : messages_) { - msg.Attach(m); + for (Message &m : messages_) { + msg.Attach(std::move(m)); } + messages_.clear(); } bool Messages::AnyFatalError() const { diff --git a/flang/lib/parser/message.h b/flang/lib/parser/message.h index 8c7bddb..fbe97bb 100644 --- a/flang/lib/parser/message.h +++ b/flang/lib/parser/message.h @@ -151,9 +151,8 @@ public: attachmentIsContext_ = true; } Message &Attach(Message *); - template - Message &Attach(A &&... args) { - return Attach(new Message{std::move(args)...}); // reference-counted + template Message &Attach(A &&... args) { + return Attach(new Message{std::forward(args)...}); // reference-counted } bool SortBefore(const Message &that) const; @@ -205,8 +204,8 @@ public: bool empty() const { return messages_.empty(); } - template Message &Say(A... args) { - last_ = messages_.emplace_after(last_, std::move(args)...); + template Message &Say(A... args) { + last_ = messages_.emplace_after(last_, std::forward(args)...); return *last_; } @@ -254,17 +253,16 @@ public: return common::ScopedSet(at_, std::move(at)); } - template - Message *Say(CharBlock at, A &&... args) { + template Message *Say(CharBlock at, A &&... args) { if (messages_ != nullptr) { - return &messages_->Say(at, std::move(args)...); + return &messages_->Say(at, std::forward(args)...); } else { return nullptr; } } - template Message *Say(A &&... args) { - return Say(at_, std::move(args)...); + template Message *Say(A &&... args) { + return Say(at_, std::forward(args)...); } private: diff --git a/flang/lib/parser/parse-state.h b/flang/lib/parser/parse-state.h index 13f25f9..65ec9ec 100644 --- a/flang/lib/parser/parse-state.h +++ b/flang/lib/parser/parse-state.h @@ -143,21 +143,19 @@ public: context_ = context_->attachment(); } - template - void Say(CharBlock range, A &&... args) { + template void Say(CharBlock range, A &&... args) { if (deferMessages_) { anyDeferredMessages_ = true; } else { - messages_.Say(range, std::move(args)...).SetContext(context_.get()); + messages_.Say(range, std::forward(args)...).SetContext(context_.get()); } } - template - void Say(const MessageFixedText &text, A &&... args) { - Say(p_, text, std::move(args)...); + template void Say(const MessageFixedText &text, A &&... args) { + Say(p_, text, std::forward(args)...); } - template + template void Say(const MessageExpectedText &text, A &&... args) { - Say(p_, text, std::move(args)...); + Say(p_, text, std::forward(args)...); } void Nonstandard(LanguageFeature lf, const MessageFixedText &msg) { diff --git a/flang/lib/parser/parse-tree.cc b/flang/lib/parser/parse-tree.cc index 114dc20..9497d64 100644 --- a/flang/lib/parser/parse-tree.cc +++ b/flang/lib/parser/parse-tree.cc @@ -87,8 +87,9 @@ bool DoConstruct::IsDoConcurrent() const { return control && std::holds_alternative(control->u); } -static Designator MakeArrayElementRef(Name &name, std::list &subscripts) { - ArrayElement arrayElement{name, std::list{}}; +static Designator MakeArrayElementRef( + const Name &name, std::list &subscripts) { + ArrayElement arrayElement{Name{name.source}, std::list{}}; for (Expr &expr : subscripts) { arrayElement.subscripts.push_back(SectionSubscript{ Scalar{Integer{common::Indirection{std::move(expr)}}}}); @@ -162,7 +163,8 @@ Statement StmtFunctionStmt::ConvertToAssignment() { auto &funcExpr{std::get>(t).thing}; std::list subscripts; for (Name &arg : funcArgs) { - subscripts.push_back(Expr{common::Indirection{Designator{arg}}}); + subscripts.push_back( + Expr{common::Indirection{Designator{Name{arg.source}}}}); } auto variable{ Variable{common::Indirection{MakeArrayElementRef(funcName, subscripts)}}}; diff --git a/flang/lib/parser/prescan.h b/flang/lib/parser/prescan.h index 1214159..948fc3f 100644 --- a/flang/lib/parser/prescan.h +++ b/flang/lib/parser/prescan.h @@ -70,8 +70,8 @@ public: TokenSequence TokenizePreprocessorDirective(); Provenance GetCurrentProvenance() const { return GetProvenance(at_); } - template Message &Say(A &&... a) { - Message &m{messages_.Say(std::move(a)...)}; + template Message &Say(A &&... a) { + Message &m{messages_.Say(std::forward(a)...)}; std::optional range{m.GetProvenanceRange(cooked_)}; CHECK(!range.has_value() || cooked_.IsValid(*range)); return m; diff --git a/flang/lib/semantics/assignment.cc b/flang/lib/semantics/assignment.cc index 8f31981..0ff23af 100644 --- a/flang/lib/semantics/assignment.cc +++ b/flang/lib/semantics/assignment.cc @@ -120,9 +120,8 @@ private: MaskExpr GetMask(const parser::LogicalExpr &, bool defaultValue = true) const; - template - parser::Message *Say(A &&... args) { - return messages_.Say(std::move(args)...); + template parser::Message *Say(A &&... args) { + return messages_.Say(std::forward(args)...); } SemanticsContext &context_; diff --git a/flang/lib/semantics/expression.h b/flang/lib/semantics/expression.h index 604981c..ce01c7a 100644 --- a/flang/lib/semantics/expression.h +++ b/flang/lib/semantics/expression.h @@ -80,14 +80,13 @@ public: return GetFoldingContext().messages(); } - template - parser::Message *Say(A &&... args) { - return GetContextualMessages().Say(std::move(args)...); + template parser::Message *Say(A &&... args) { + return GetContextualMessages().Say(std::forward(args)...); } - template + template parser::Message *SayAt(const T &parsed, A &&... args) { - return Say(parser::FindSourceLocation(parsed), std::move(args)...); + return Say(parser::FindSourceLocation(parsed), std::forward(args)...); } int GetDefaultKind(common::TypeCategory); diff --git a/flang/lib/semantics/resolve-names.cc b/flang/lib/semantics/resolve-names.cc index bcb2277..c1305b8 100644 --- a/flang/lib/semantics/resolve-names.cc +++ b/flang/lib/semantics/resolve-names.cc @@ -172,12 +172,13 @@ public: } } - template - Message &Say(const parser::Name &name, A &&... args) { - return messageHandler_.Say(name.source, std::move(args)...); + template Message &Say(A &&... args) { + return messageHandler_.Say(std::forward(args)...); } - template Message &Say(A &&... args) { - return messageHandler_.Say(std::move(args)...); + template + Message &Say( + const parser::Name &name, MessageFixedText &&text, const A &... args) { + return messageHandler_.Say(name.source, std::move(text), args...); } private: @@ -491,7 +492,7 @@ public: SayAlreadyDeclared(name, *symbol); // replace the old symbol with a new one with correct details EraseSymbol(*symbol); - return MakeSymbol(name, attrs, details); + return MakeSymbol(name, attrs, std::move(details)); } } @@ -2186,14 +2187,14 @@ bool SubprogramVisitor::HandleStmtFunction(const parser::StmtFunctionStmt &x) { } } } - details.add_dummyArg(MakeSymbol(dummyName, dummyDetails)); + details.add_dummyArg(MakeSymbol(dummyName, std::move(dummyDetails))); } EraseSymbol(name); // added by PushSubprogramScope EntityDetails resultDetails; if (resultType) { resultDetails.set_type(*resultType); } - details.set_result(MakeSymbol(name, resultDetails)); + details.set_result(MakeSymbol(name, std::move(resultDetails))); return true; } @@ -2318,7 +2319,8 @@ void SubprogramVisitor::Post(const parser::FunctionStmt &stmt) { // add function result to function scope EntityDetails funcResultDetails; funcResultDetails.set_funcResult(true); - funcInfo_.resultSymbol = &MakeSymbol(*funcResultName, funcResultDetails); + funcInfo_.resultSymbol = + &MakeSymbol(*funcResultName, std::move(funcResultDetails)); details.set_result(*funcInfo_.resultSymbol); } @@ -3457,7 +3459,7 @@ void DeclarationVisitor::CheckSaveStmts() { "Explicit SAVE of '%s' is redundant due to global SAVE statement"_err_en_US, *saveInfo_.saveAll, "Global SAVE statement"_en_US); } else if (auto msg{CheckSaveAttr(*symbol)}) { - Say(name, *msg); + Say(name, std::move(*msg)); } else { SetSaveAttr(*symbol); } @@ -3800,7 +3802,7 @@ Symbol *DeclarationVisitor::MakeTypeSymbol( std::holds_alternative(details)) { attrs.set(Attr::PRIVATE); } - Symbol &result{MakeSymbol(name, attrs, details)}; + Symbol &result{MakeSymbol(name, attrs, std::move(details))}; if (result.has()) { derivedType.symbol()->get().add_paramDecl(result); } diff --git a/flang/lib/semantics/rewrite-parse-tree.cc b/flang/lib/semantics/rewrite-parse-tree.cc index 1788f11..a1cd773 100644 --- a/flang/lib/semantics/rewrite-parse-tree.cc +++ b/flang/lib/semantics/rewrite-parse-tree.cc @@ -91,10 +91,11 @@ 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.value().ConvertToAssignment(); + auto stmt{sf.statement.value().ConvertToAssignment()}; stmt.source = sf.source; x.v.insert(origFirst, - parser::ExecutionPartConstruct{parser::ExecutableConstruct{stmt}}); + parser::ExecutionPartConstruct{ + parser::ExecutableConstruct{std::move(stmt)}}); } stmtFuncsToConvert_.clear(); return true; -- 2.7.4