[PATCH] D69388: [clang-tidy] Fix modernize-use-nodiscard check for classes marked as [[nodiscard]]

Eugene Sedykh via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 24 08:36:01 PDT 2019


sedykh.eugene created this revision.
sedykh.eugene added reviewers: MyDeveloperDay, JonasToth.
sedykh.eugene added a project: clang-tools-extra.
Herald added subscribers: cfe-commits, mgehre, xazax.hun.
Herald added a project: clang.

Current implementation suggests to add [[nodiscard]] to methods even if the return type is marked already as [[nodiscard]]:

Try this:

struct [[nodiscard]] S{};

class C{

  S method() const; --> suggests adding [[nodiscard]]

};

This small diff fixes this incorrect behaviour.

This is my first timid try to contribute to open source, so please help me with this piece of code. Maybe there are better ways.


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D69388

Files:
  clang-tidy/modernize/UseNodiscardCheck.cpp
  test/clang-tidy/checkers/modernize-use-nodiscard.cpp


Index: test/clang-tidy/checkers/modernize-use-nodiscard.cpp
===================================================================
--- test/clang-tidy/checkers/modernize-use-nodiscard.cpp
+++ test/clang-tidy/checkers/modernize-use-nodiscard.cpp
@@ -23,6 +23,8 @@
 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 @@
 
     // 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.
Index: clang-tidy/modernize/UseNodiscardCheck.cpp
===================================================================
--- clang-tidy/modernize/UseNodiscardCheck.cpp
+++ clang-tidy/modernize/UseNodiscardCheck.cpp
@@ -94,16 +94,20 @@
   auto FunctionObj =
       cxxRecordDecl(hasAnyName("::std::function", "::boost::function"));
 
+  using clang::attr::WarnUnusedResult;
+
   // Find all non-void const methods which have not already been marked to
   // warn on unused result.
   Finder->addMatcher(
       cxxMethodDecl(
           allOf(isConst(), isDefinitionOrInline(),
                 unless(anyOf(
-                    returns(voidType()), isNoReturn(), isOverloadedOperator(),
+                    returns(voidType()),
+                    returns(hasDeclaration(decl(hasAttr(WarnUnusedResult)))),
+                    isNoReturn(), isOverloadedOperator(),
                     isVariadic(), hasTemplateReturnType(),
                     hasClassMutableFields(), isConversionOperator(),
-                    hasAttr(clang::attr::WarnUnusedResult),
+                    hasAttr(WarnUnusedResult),
                     hasType(isInstantiationDependentType()),
                     hasAnyParameter(anyOf(
                         parmVarDecl(anyOf(hasType(FunctionObj),


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69388.226260.patch
Type: text/x-patch
Size: 2042 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191024/aa84cb54/attachment.bin>


More information about the cfe-commits mailing list