@@ -335,13 +335,23 @@ class Messages {
335
335
}
336
336
337
337
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 ;
340
345
}
341
346
342
347
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 ;
345
355
}
346
356
347
357
void Annex (Messages &&that) {
@@ -360,6 +370,14 @@ class Messages {
360
370
bool AnyFatalError (bool warningsAreErrors = false ) const ;
361
371
362
372
private:
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
+ }
363
381
std::list<Message> messages_;
364
382
};
365
383
@@ -422,24 +440,6 @@ class ContextualMessages {
422
440
return Say (at.value_or (at_), std::forward<A>(args)...);
423
441
}
424
442
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
-
443
443
Message *Say (Message &&msg) {
444
444
if (messages_ != nullptr ) {
445
445
if (contextMessage_) {
@@ -451,6 +451,39 @@ class ContextualMessages {
451
451
}
452
452
}
453
453
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
+
454
487
private:
455
488
CharBlock at_;
456
489
Messages *messages_{nullptr };
0 commit comments