@@ -335,13 +335,23 @@ class Messages {
335335 }
336336
337337 template <typename ... A>
338- Message &Say (common::LanguageFeature feature, A &&...args) {
339- return Say (std::forward<A>(args)...).set_languageFeature (feature);
338+ Message *Warn (bool isInModuleFile,
339+ const common::LanguageFeatureControl &control,
340+ common::LanguageFeature feature, A &&...args) {
341+ if (!isInModuleFile && control.ShouldWarn (feature)) {
342+ return &AddWarning (feature, std::forward<A>(args)...);
343+ }
344+ return nullptr ;
340345 }
341346
342347 template <typename ... A>
343- Message &Say (common::UsageWarning warning, A &&...args) {
344- return Say (std::forward<A>(args)...).set_usageWarning (warning);
348+ Message *Warn (bool isInModuleFile,
349+ const common::LanguageFeatureControl &control,
350+ common::UsageWarning warning, A &&...args) {
351+ if (!isInModuleFile && control.ShouldWarn (warning)) {
352+ return &AddWarning (warning, std::forward<A>(args)...);
353+ }
354+ return nullptr ;
345355 }
346356
347357 void Annex (Messages &&that) {
@@ -360,6 +370,14 @@ class Messages {
360370 bool AnyFatalError (bool warningsAreErrors = false ) const ;
361371
362372private:
373+ template <typename ... A>
374+ Message &AddWarning (common::UsageWarning warning, A &&...args) {
375+ return messages_.emplace_back (warning, std::forward<A>(args)...);
376+ }
377+ template <typename ... A>
378+ Message &AddWarning (common::LanguageFeature feature, A &&...args) {
379+ return messages_.emplace_back (feature, std::forward<A>(args)...);
380+ }
363381 std::list<Message> messages_;
364382};
365383
@@ -422,24 +440,6 @@ class ContextualMessages {
422440 return Say (at.value_or (at_), std::forward<A>(args)...);
423441 }
424442
425- template <typename ... A>
426- Message *Say (common::LanguageFeature feature, A &&...args) {
427- Message *msg{Say (std::forward<A>(args)...)};
428- if (msg) {
429- msg->set_languageFeature (feature);
430- }
431- return msg;
432- }
433-
434- template <typename ... A>
435- Message *Say (common::UsageWarning warning, A &&...args) {
436- Message *msg{Say (std::forward<A>(args)...)};
437- if (msg) {
438- msg->set_usageWarning (warning);
439- }
440- return msg;
441- }
442-
443443 Message *Say (Message &&msg) {
444444 if (messages_ != nullptr ) {
445445 if (contextMessage_) {
@@ -451,6 +451,39 @@ class ContextualMessages {
451451 }
452452 }
453453
454+ template <typename FeatureOrUsageWarning, typename ... A>
455+ Message *Warn (bool isInModuleFile,
456+ const common::LanguageFeatureControl &control,
457+ FeatureOrUsageWarning feature, CharBlock at, A &&...args) {
458+ if (messages_ != nullptr ) {
459+ if (Message *
460+ msg{messages_->Warn (isInModuleFile, control, feature, at,
461+ std::forward<A>(args)...)}) {
462+ if (contextMessage_) {
463+ msg->SetContext (contextMessage_.get ());
464+ }
465+ return msg;
466+ }
467+ }
468+ return nullptr ;
469+ }
470+
471+ template <typename FeatureOrUsageWarning, typename ... A>
472+ Message *Warn (bool isInModuleFile,
473+ const common::LanguageFeatureControl &control,
474+ FeatureOrUsageWarning feature, A &&...args) {
475+ return Warn (
476+ isInModuleFile, control, feature, at_, std::forward<A>(args)...);
477+ }
478+
479+ template <typename FeatureOrUsageWarning, typename ... A>
480+ Message *Warn (bool isInModuleFile,
481+ const common::LanguageFeatureControl &control,
482+ FeatureOrUsageWarning feature, std::optional<CharBlock> at, A &&...args) {
483+ return Warn (isInModuleFile, control, feature, at.value_or (at_),
484+ std::forward<A>(args)...);
485+ }
486+
454487private:
455488 CharBlock at_;
456489 Messages *messages_{nullptr };
0 commit comments