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), 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.