================
@@ -489,6 +567,44 @@ void test() {
   from_a_template<NoDiscard>(); // expected-warning {{ignoring return value of 
type 'NoDiscard' declared with 'nodiscard' attribute}}
   from_a_template<WarnUnused>(); // no warning
   from_a_template<WarnUnusedResult>(); // expected-warning {{ignoring return 
value of type 'WarnUnusedResult' declared with 'gnu::warn_unused_result' 
attribute}}
+
+  // In a template instantiation the information about the typedef is lost,
+  // so the candiscard attribute is lost, so the diagnostic is not suppressed
+  from_a_template<NoDIgnored>();       // expected-warning {{ignoring return 
value of type 'NoDiscard' declared with 'nodiscard' attribute}}
+  from_a_template<WUIgnored>();        // no warning
+  from_a_template<WURIgnored>();       // expected-warning {{ignoring return 
value of type 'WarnUnusedResult' declared with 'gnu::warn_unused_result' 
attribute}}
+
+  from_a_template_ignored<NoDiscard>();        // no warning
+  from_a_template_ignored<WarnUnused>();       // no warning
+  from_a_template_ignored<WarnUnusedResult>(); // no warning
+
+  return_nodint();            // expected-warning {{ignoring return value of 
type 'NoDInt' declared with 'clang::warn_unused_result' attribute}}
+  return_nodint_ignored();    // no warning
+  return_nodclass();          // expected-warning {{ignoring return value of 
type 'NoDClass' declared with 'nodiscard' attribute}}
+  return_nodclass_ignored();  // no warning
+
+  // In an alias template the information about the typedef is lost,
+  // so the diagnostic is not issued. GH#68456
+  return_nodtemplate();
+
+  // In an alias template the information about the typedef is lost,
+  // so the diagnostic is not suppressed. GH#68456
+  return_nodint2();           // expected-warning {{ignoring return value of 
type 'NoDInt' declared with 'clang::warn_unused_result' attribute}}
+  return_nodint_ignored2();   // expected-warning {{ignoring return value of 
type 'NoDInt' declared with 'clang::warn_unused_result' attribute}}
+  return_nodclass2();         // expected-warning {{ignoring return value of 
type 'NoDClass' declared with 'nodiscard' attribute}}
+  return_nodclass_ignored2(); // expected-warning {{ignoring return value of 
type 'NoDClass' declared with 'nodiscard' attribute}}
+}
+
+using BothAttributes [[clang::warn_unused_result, clang::candiscard]] = int;
+
+BothAttributes return_bothattributes1();
+[[nodiscard, clang::candiscard]] int return_bothattributes2();
+[[nodiscard]] NoDIgnored return_nodignored_nodiscard();
+
+void testBothAttributes() {
+  return_bothattributes1(); // no warning because candiscard takes priority
+  return_bothattributes2(); // no warning because candiscard takes priority
----------------
cor3ntin wrote:

Why though? Have you considered warning in this case?

https://github.com/llvm/llvm-project/pull/154943
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to