You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[clang] Add the candiscard attribute to suppress nodiscard
Fulfills the requirement that @huixie90 stated in llvm#139651
that Clang should have a way to disable [[nodiscard]] on a
function by function basis.
This will allow us finally to resume fixing llvm#130656.
template <classT> [[clang::candiscard]] T from_a_template_ignored();
441
458
442
459
voidtest() {
443
460
// Unused but named variables
@@ -474,11 +491,23 @@ void test() {
474
491
return_nodiscard(); // expected-warning {{ignoring return value of type 'NoDiscard' declared with 'nodiscard' attribute}}
475
492
return_warnunused(); // no warning
476
493
return_warnunusedresult(); // expected-warning {{ignoring return value of type 'WarnUnusedResult' declared with 'gnu::warn_unused_result' attribute}}
494
+
return_nodiscard_ignored(); // no warning
495
+
return_warnunused_ignored(); // no warning
496
+
return_warnunusedresult_ignored(); // no warning
497
+
return_nodiscard_ignored2(); // no warning
498
+
return_warnunused_ignored2(); // no warning
499
+
return_warnunusedresult_ignored2(); // no warning
477
500
478
501
// Function pointer return values
479
502
p_return_nodiscard(); // expected-warning {{ignoring return value of type 'NoDiscard' declared with 'nodiscard' attribute}}
480
503
p_return_warnunused(); // no warning
481
504
p_return_warnunusedresult(); // expected-warning {{ignoring return value of type 'WarnUnusedResult' declared with 'gnu::warn_unused_result' attribute}}
505
+
p_return_nodiscard_ignored(); // no warning
506
+
p_return_warnunused_ignored(); // no warning
507
+
p_return_warnunusedresult_ignored(); // no warning
508
+
p_return_nodiscard_ignored2(); // no warning
509
+
p_return_warnunused_ignored2(); // no warning
510
+
p_return_warnunusedresult_ignored2(); // no warning
482
511
483
512
// Function pointer expression return values
484
513
pp_return_nodiscard()(); // expected-warning {{ignoring return value of type 'NoDiscard' declared with 'nodiscard' attribute}}
@@ -489,6 +518,16 @@ void test() {
489
518
from_a_template<NoDiscard>(); // expected-warning {{ignoring return value of type 'NoDiscard' declared with 'nodiscard' attribute}}
490
519
from_a_template<WarnUnused>(); // no warning
491
520
from_a_template<WarnUnusedResult>(); // expected-warning {{ignoring return value of type 'WarnUnusedResult' declared with 'gnu::warn_unused_result' attribute}}
521
+
522
+
// In a template instantiation the information about the typedef is lost,
523
+
// so the candiscard attribute is lost, so the diagnostic is not suppressed
524
+
from_a_template<NoDIgnored>(); // expected-warning {{ignoring return value of type 'NoDiscard' declared with 'nodiscard' attribute}}
525
+
from_a_template<WUIgnored>(); // no warning
526
+
from_a_template<WURIgnored>(); // expected-warning {{ignoring return value of type 'WarnUnusedResult' declared with 'gnu::warn_unused_result' attribute}}
527
+
528
+
from_a_template_ignored<NoDiscard>(); // no warning
529
+
from_a_template_ignored<WarnUnused>(); // no warning
530
+
from_a_template_ignored<WarnUnusedResult>(); // no warning
0 commit comments