[flang] Revert to forwarding on variadic messaging APIs
authorpeter klausler <pklausler@nvidia.com>
Mon, 8 Apr 2019 19:54:16 +0000 (12:54 -0700)
committerpeter klausler <pklausler@nvidia.com>
Mon, 8 Apr 2019 21:29:47 +0000 (14:29 -0700)
Original-commit: flang-compiler/f18@d2e464eb15ef9debf675a7eb262ac1e007b56b17
Reviewed-on: https://github.com/flang-compiler/f18/pull/390
Tree-same-pre-rewrite: false

flang/lib/common/template.h
flang/lib/parser/message.h
flang/lib/parser/parse-state.h
flang/lib/parser/parse-tree.h
flang/lib/parser/prescan.h
flang/lib/semantics/assignment.cc
flang/lib/semantics/expression.h
flang/lib/semantics/resolve-names.cc
flang/lib/semantics/semantics.h

index e55e95f..2c88bd4 100644 (file)
@@ -267,7 +267,7 @@ std::optional<std::tuple<A...>> AllPresent(std::optional<A> &&... x) {
 // N.B. If the function returns std::optional, MapOptional will return
 // std::optional<std::optional<...>> and you will probably want to
 // run it through JoinOptional to "squash" it.
-template<typename R, typename... A, NO_LVALUE_REFERENCE(A)>
+template<typename R, typename... A>
 std::optional<R> MapOptional(
     std::function<R(A &&...)> &&f, std::optional<A> &&... x) {
   if (auto args{AllPresent(std::move(x)...)}) {
@@ -275,7 +275,7 @@ std::optional<R> MapOptional(
   }
   return std::nullopt;
 }
-template<typename R, typename... A, NO_LVALUE_REFERENCE(A)>
+template<typename R, typename... A>
 std::optional<R> MapOptional(R (*f)(A &&...), std::optional<A> &&... x) {
   return MapOptional(std::function<R(A && ...)>{f}, std::move(x)...);
 }
index 7d66631..fbe97bb 100644 (file)
@@ -151,9 +151,8 @@ public:
     attachmentIsContext_ = true;
   }
   Message &Attach(Message *);
-  template<typename... A, NO_LVALUE_REFERENCE(A)>
-  Message &Attach(A &&... args) {
-    return Attach(new Message{std::move(args)...});  // reference-counted
+  template<typename... A> Message &Attach(A &&... args) {
+    return Attach(new Message{std::forward<A>(args)...});  // reference-counted
   }
 
   bool SortBefore(const Message &that) const;
@@ -206,7 +205,7 @@ public:
   bool empty() const { return messages_.empty(); }
 
   template<typename... A> Message &Say(A... args) {
-    last_ = messages_.emplace_after(last_, args...);
+    last_ = messages_.emplace_after(last_, std::forward<A>(args)...);
     return *last_;
   }
 
@@ -254,17 +253,16 @@ public:
     return common::ScopedSet(at_, std::move(at));
   }
 
-  template<typename... A, NO_LVALUE_REFERENCE(A)>
-  Message *Say(CharBlock at, A &&... args) {
+  template<typename... A> Message *Say(CharBlock at, A &&... args) {
     if (messages_ != nullptr) {
-      return &messages_->Say(at, std::move(args)...);
+      return &messages_->Say(at, std::forward<A>(args)...);
     } else {
       return nullptr;
     }
   }
 
-  template<typename... A, NO_LVALUE_REFERENCE(A)> Message *Say(A &&... args) {
-    return Say(at_, std::move(args)...);
+  template<typename... A> Message *Say(A &&... args) {
+    return Say(at_, std::forward<A>(args)...);
   }
 
 private:
index 15e25f7..65ec9ec 100644 (file)
@@ -143,18 +143,19 @@ public:
     context_ = context_->attachment();
   }
 
-  template<typename... A> void Say(CharBlock range, A... args) {
+  template<typename... A> void Say(CharBlock range, A &&... args) {
     if (deferMessages_) {
       anyDeferredMessages_ = true;
     } else {
-      messages_.Say(range, args...).SetContext(context_.get());
+      messages_.Say(range, std::forward<A>(args)...).SetContext(context_.get());
     }
   }
-  template<typename... A> void Say(const MessageFixedText &text, A... args) {
-    Say(p_, text, args...);
+  template<typename... A> void Say(const MessageFixedText &text, A &&... args) {
+    Say(p_, text, std::forward<A>(args)...);
   }
-  template<typename... A> void Say(const MessageExpectedText &text, A... args) {
-    Say(p_, text, args...);
+  template<typename... A>
+  void Say(const MessageExpectedText &text, A &&... args) {
+    Say(p_, text, std::forward<A>(args)...);
   }
 
   void Nonstandard(LanguageFeature lf, const MessageFixedText &msg) {
index 12a1436..f8828a6 100644 (file)
@@ -108,7 +108,7 @@ struct GenericExprWrapper;  // forward definition, wraps Expr<SomeType>
 // Many other classes below simply wrap a std::tuple<> structure, which
 // is conventionally named "t".
 #define TUPLE_CLASS_BOILERPLATE(classname) \
-  template<typename... Ts, bool = (... && !std::is_lvalue_reference_v<Ts>)> \
+  template<typename... Ts, NO_LVALUE_REFERENCE(Ts)> \
   classname(Ts &&... args) : t(std::move(args)...) {} \
   using TupleTrait = std::true_type; \
   BOILERPLATE(classname)
index 444bd7f..948fc3f 100644 (file)
@@ -70,8 +70,8 @@ public:
   TokenSequence TokenizePreprocessorDirective();
   Provenance GetCurrentProvenance() const { return GetProvenance(at_); }
 
-  template<typename... A> Message &Say(A... a) {
-    Message &m{messages_.Say(a...)};
+  template<typename... A> Message &Say(A &&... a) {
+    Message &m{messages_.Say(std::forward<A>(a)...)};
     std::optional<ProvenanceRange> range{m.GetProvenanceRange(cooked_)};
     CHECK(!range.has_value() || cooked_.IsValid(*range));
     return m;
index 603f93a..0ff23af 100644 (file)
@@ -120,8 +120,8 @@ private:
 
   MaskExpr GetMask(const parser::LogicalExpr &, bool defaultValue = true) const;
 
-  template<typename... A> parser::Message *Say(A... args) {
-    return messages_.Say(args...);
+  template<typename... A> parser::Message *Say(A &&... args) {
+    return messages_.Say(std::forward<A>(args)...);
   }
 
   SemanticsContext &context_;
index 604981c..ce01c7a 100644 (file)
@@ -80,14 +80,13 @@ public:
     return GetFoldingContext().messages();
   }
 
-  template<typename... A, NO_LVALUE_REFERENCE(A)>
-  parser::Message *Say(A &&... args) {
-    return GetContextualMessages().Say(std::move(args)...);
+  template<typename... A> parser::Message *Say(A &&... args) {
+    return GetContextualMessages().Say(std::forward<A>(args)...);
   }
 
-  template<typename T, typename... A, NO_LVALUE_REFERENCE(A)>
+  template<typename T, typename... A>
   parser::Message *SayAt(const T &parsed, A &&... args) {
-    return Say(parser::FindSourceLocation(parsed), std::move(args)...);
+    return Say(parser::FindSourceLocation(parsed), std::forward<A>(args)...);
   }
 
   int GetDefaultKind(common::TypeCategory);
index bcb2277..27d9e70 100644 (file)
@@ -172,12 +172,11 @@ public:
     }
   }
 
-  template<typename... A, NO_LVALUE_REFERENCE(A)>
-  Message &Say(const parser::Name &name, A &&... args) {
-    return messageHandler_.Say(name.source, std::move(args)...);
+  template<typename... A> Message &Say(const parser::Name &name, A &&... args) {
+    return messageHandler_.Say(name.source, std::forward<A>(args)...);
   }
-  template<typename... A, NO_LVALUE_REFERENCE(A)> Message &Say(A &&... args) {
-    return messageHandler_.Say(std::move(args)...);
+  template<typename... A> Message &Say(A &&... args) {
+    return messageHandler_.Say(std::forward<A>(args)...);
   }
 
 private:
index e802b96..6fa3817 100644 (file)
@@ -83,14 +83,13 @@ public:
 
   bool AnyFatalError() const;
 
-  template<typename... A, NO_LVALUE_REFERENCE(A)>
+  template<typename... A>
   parser::Message &Say(const parser::CharBlock &at, A &&... args) {
-    return messages_.Say(at, std::move(args)...);
+    return messages_.Say(at, std::forward<A>(args)...);
   }
-  template<typename... A, NO_LVALUE_REFERENCE(A)>
-  parser::Message &Say(A &&... args) {
+  template<typename... A> parser::Message &Say(A &&... args) {
     CHECK(location_);
-    return messages_.Say(*location_, std::move(args)...);
+    return messages_.Say(*location_, std::forward<A>(args)...);
   }
   parser::Message &Say(parser::Message &&msg) {
     return messages_.Say(std::move(msg));