Fix modernize-use-nodiscard for classes marked [[nodiscard]]
authorAaron Ballman <aaron@aaronballman.com>
Wed, 30 Oct 2019 17:44:18 +0000 (13:44 -0400)
committerAaron Ballman <aaron@aaronballman.com>
Wed, 30 Oct 2019 17:45:37 +0000 (13:45 -0400)
Current implementation suggests to add [[nodiscard]] to methods even if the
return type is marked already as [[nodiscard]].

Patch by Eugene Sedykh.

clang-tools-extra/clang-tidy/modernize/UseNodiscardCheck.cpp
clang-tools-extra/test/clang-tidy/checkers/modernize-use-nodiscard.cpp

index d2ac7d5..f9d72f5 100644 (file)
@@ -100,7 +100,9 @@ void UseNodiscardCheck::registerMatchers(MatchFinder *Finder) {
       cxxMethodDecl(
           allOf(isConst(), isDefinitionOrInline(),
                 unless(anyOf(
-                    returns(voidType()), isNoReturn(), isOverloadedOperator(),
+                    returns(voidType()),
+                    returns(hasDeclaration(decl(hasAttr(clang::attr::WarnUnusedResult)))),
+                    isNoReturn(), isOverloadedOperator(),
                     isVariadic(), hasTemplateReturnType(),
                     hasClassMutableFields(), isConversionOperator(),
                     hasAttr(clang::attr::WarnUnusedResult),
index a571f09..7340713 100644 (file)
@@ -23,6 +23,8 @@ typedef unsigned my_unsigned;
 typedef unsigned &my_unsigned_reference;
 typedef const unsigned &my_unsigned_const_reference;
 
+struct NO_DISCARD NoDiscardStruct{};
+
 class Foo {
 public:
     using size_type = unsigned;
@@ -160,6 +162,9 @@ public:
 
     // Do not add ``[[nodiscard]]`` to conversion functions.
     // explicit operator bool() const { return true; }
+
+    // Do not add ``[[nodiscard]]`` to functions returning types marked [[nodiscard]].
+    NoDiscardStruct f50() const;
 };
 
 // Do not add ``[[nodiscard]]`` to Lambda.