// 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)...)}) {
}
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)...);
}
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;
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_;
}
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:
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) {
// 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)
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;
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_;
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);
}
}
- 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:
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));