[flang] Revert that reversion. Move semantics work just fine.
authorpeter klausler <pklausler@nvidia.com>
Mon, 8 Apr 2019 20:53:10 +0000 (13:53 -0700)
committerpeter klausler <pklausler@nvidia.com>
Mon, 8 Apr 2019 21:29:47 +0000 (14:29 -0700)
Original-commit: flang-compiler/f18@72bd8e7b03011b6e96efa40ed269c5bdfc8d955d
Reviewed-on: https://github.com/flang-compiler/f18/pull/390
Tree-same-pre-rewrite: false

flang/lib/parser/message.h
flang/lib/parser/parse-state.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 fbe97bb..8c7bddb 100644 (file)
@@ -151,8 +151,9 @@ public:
     attachmentIsContext_ = true;
   }
   Message &Attach(Message *);
-  template<typename... A> Message &Attach(A &&... args) {
-    return Attach(new Message{std::forward<A>(args)...});  // reference-counted
+  template<typename... A, NO_LVALUE_REFERENCE(A)>
+  Message &Attach(A &&... args) {
+    return Attach(new Message{std::move(args)...});  // reference-counted
   }
 
   bool SortBefore(const Message &that) const;
@@ -204,8 +205,8 @@ public:
 
   bool empty() const { return messages_.empty(); }
 
-  template<typename... A> Message &Say(A... args) {
-    last_ = messages_.emplace_after(last_, std::forward<A>(args)...);
+  template<typename... A, NO_LVALUE_REFERENCE(A)> Message &Say(A... args) {
+    last_ = messages_.emplace_after(last_, std::move(args)...);
     return *last_;
   }
 
@@ -253,16 +254,17 @@ public:
     return common::ScopedSet(at_, std::move(at));
   }
 
-  template<typename... A> Message *Say(CharBlock at, A &&... args) {
+  template<typename... A, NO_LVALUE_REFERENCE(A)>
+  Message *Say(CharBlock at, A &&... args) {
     if (messages_ != nullptr) {
-      return &messages_->Say(at, std::forward<A>(args)...);
+      return &messages_->Say(at, std::move(args)...);
     } else {
       return nullptr;
     }
   }
 
-  template<typename... A> Message *Say(A &&... args) {
-    return Say(at_, std::forward<A>(args)...);
+  template<typename... A, NO_LVALUE_REFERENCE(A)> Message *Say(A &&... args) {
+    return Say(at_, std::move(args)...);
   }
 
 private:
index 65ec9ec..13f25f9 100644 (file)
@@ -143,19 +143,21 @@ public:
     context_ = context_->attachment();
   }
 
-  template<typename... A> void Say(CharBlock range, A &&... args) {
+  template<typename... A, NO_LVALUE_REFERENCE(A)>
+  void Say(CharBlock range, A &&... args) {
     if (deferMessages_) {
       anyDeferredMessages_ = true;
     } else {
-      messages_.Say(range, std::forward<A>(args)...).SetContext(context_.get());
+      messages_.Say(range, std::move(args)...).SetContext(context_.get());
     }
   }
-  template<typename... A> void Say(const MessageFixedText &text, A &&... args) {
-    Say(p_, text, std::forward<A>(args)...);
+  template<typename... A, NO_LVALUE_REFERENCE(A)>
+  void Say(const MessageFixedText &text, A &&... args) {
+    Say(p_, text, std::move(args)...);
   }
-  template<typename... A>
+  template<typename... A, NO_LVALUE_REFERENCE(A)>
   void Say(const MessageExpectedText &text, A &&... args) {
-    Say(p_, text, std::forward<A>(args)...);
+    Say(p_, text, std::move(args)...);
   }
 
   void Nonstandard(LanguageFeature lf, const MessageFixedText &msg) {
index 948fc3f..1214159 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(std::forward<A>(a)...)};
+  template<typename... A, NO_LVALUE_REFERENCE(A)> Message &Say(A &&... a) {
+    Message &m{messages_.Say(std::move(a)...)};
     std::optional<ProvenanceRange> range{m.GetProvenanceRange(cooked_)};
     CHECK(!range.has_value() || cooked_.IsValid(*range));
     return m;
index 0ff23af..8f31981 100644 (file)
@@ -120,8 +120,9 @@ private:
 
   MaskExpr GetMask(const parser::LogicalExpr &, bool defaultValue = true) const;
 
-  template<typename... A> parser::Message *Say(A &&... args) {
-    return messages_.Say(std::forward<A>(args)...);
+  template<typename... A, NO_LVALUE_REFERENCE(A)>
+  parser::Message *Say(A &&... args) {
+    return messages_.Say(std::move(args)...);
   }
 
   SemanticsContext &context_;
index ce01c7a..604981c 100644 (file)
@@ -80,13 +80,14 @@ public:
     return GetFoldingContext().messages();
   }
 
-  template<typename... A> parser::Message *Say(A &&... args) {
-    return GetContextualMessages().Say(std::forward<A>(args)...);
+  template<typename... A, NO_LVALUE_REFERENCE(A)>
+  parser::Message *Say(A &&... args) {
+    return GetContextualMessages().Say(std::move(args)...);
   }
 
-  template<typename T, typename... A>
+  template<typename T, typename... A, NO_LVALUE_REFERENCE(A)>
   parser::Message *SayAt(const T &parsed, A &&... args) {
-    return Say(parser::FindSourceLocation(parsed), std::forward<A>(args)...);
+    return Say(parser::FindSourceLocation(parsed), std::move(args)...);
   }
 
   int GetDefaultKind(common::TypeCategory);
index 27d9e70..bcb2277 100644 (file)
@@ -172,11 +172,12 @@ public:
     }
   }
 
-  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(const parser::Name &name, A &&... args) {
+    return messageHandler_.Say(name.source, std::move(args)...);
   }
-  template<typename... A> Message &Say(A &&... args) {
-    return messageHandler_.Say(std::forward<A>(args)...);
+  template<typename... A, NO_LVALUE_REFERENCE(A)> Message &Say(A &&... args) {
+    return messageHandler_.Say(std::move(args)...);
   }
 
 private:
index 6fa3817..e802b96 100644 (file)
@@ -83,13 +83,14 @@ public:
 
   bool AnyFatalError() const;
 
-  template<typename... A>
+  template<typename... A, NO_LVALUE_REFERENCE(A)>
   parser::Message &Say(const parser::CharBlock &at, A &&... args) {
-    return messages_.Say(at, std::forward<A>(args)...);
+    return messages_.Say(at, std::move(args)...);
   }
-  template<typename... A> parser::Message &Say(A &&... args) {
+  template<typename... A, NO_LVALUE_REFERENCE(A)>
+  parser::Message &Say(A &&... args) {
     CHECK(location_);
-    return messages_.Say(*location_, std::forward<A>(args)...);
+    return messages_.Say(*location_, std::move(args)...);
   }
   parser::Message &Say(parser::Message &&msg) {
     return messages_.Say(std::move(msg));