From 661d2ce619e05dc47a9a232333c01dcba445cd13 Mon Sep 17 00:00:00 2001 From: Aaron Ballman Date: Wed, 30 Oct 2019 13:44:18 -0400 Subject: [PATCH] Fix modernize-use-nodiscard for classes marked [[nodiscard]] 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 | 4 +++- .../test/clang-tidy/checkers/modernize-use-nodiscard.cpp | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/modernize/UseNodiscardCheck.cpp b/clang-tools-extra/clang-tidy/modernize/UseNodiscardCheck.cpp index d2ac7d5..f9d72f5 100644 --- a/clang-tools-extra/clang-tidy/modernize/UseNodiscardCheck.cpp +++ b/clang-tools-extra/clang-tidy/modernize/UseNodiscardCheck.cpp @@ -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), diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize-use-nodiscard.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize-use-nodiscard.cpp index a571f09..7340713 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/modernize-use-nodiscard.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/modernize-use-nodiscard.cpp @@ -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. -- 2.7.4