https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/84922
>From d760b280a79be973642a0549db0e5a8838c397fd Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Tue, 12 Mar 2024 22:33:18 +0800 Subject: [PATCH 1/2] [clang-tidy]bugprone-unused-return-value ignore `++` and `--` operator overloading Fixes: #84705 --- .../bugprone/UnusedReturnValueCheck.cpp | 28 +++++++++---------- .../unused-return-value-avoid-assignment.cpp | 8 ++++++ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp index 243fe47c2036b6..83b332fba1e2da 100644 --- a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp @@ -165,20 +165,20 @@ void UnusedReturnValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { void UnusedReturnValueCheck::registerMatchers(MatchFinder *Finder) { auto MatchedDirectCallExpr = expr( - callExpr( - callee(functionDecl( - // Don't match void overloads of checked functions. - unless(returns(voidType())), - // Don't match copy or move assignment operator. - unless(cxxMethodDecl(isOperatorOverloading( - {OO_Equal, OO_PlusEqual, OO_MinusEqual, OO_StarEqual, - OO_SlashEqual, OO_PercentEqual, OO_CaretEqual, OO_AmpEqual, - OO_PipeEqual, OO_LessLessEqual, OO_GreaterGreaterEqual}))), - anyOf( - isInstantiatedFrom( - matchers::matchesAnyListedName(CheckedFunctions)), - returns(hasCanonicalType(hasDeclaration(namedDecl( - matchers::matchesAnyListedName(CheckedReturnTypes))))))))) + callExpr(callee(functionDecl( + // Don't match void overloads of checked functions. + unless(returns(voidType())), + // Don't match copy or move assignment operator. + unless(cxxMethodDecl(isOperatorOverloading( + {OO_Equal, OO_PlusEqual, OO_MinusEqual, OO_StarEqual, + OO_SlashEqual, OO_PercentEqual, OO_CaretEqual, + OO_AmpEqual, OO_PipeEqual, OO_LessLessEqual, + OO_GreaterGreaterEqual, OO_PlusPlus, OO_MinusMinus}))), + anyOf(isInstantiatedFrom( + matchers::matchesAnyListedName(CheckedFunctions)), + returns(hasCanonicalType(hasDeclaration( + namedDecl(matchers::matchesAnyListedName( + CheckedReturnTypes))))))))) .bind("match")); auto CheckCastToVoid = diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-avoid-assignment.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-avoid-assignment.cpp index b4a41004adf894..5809da9ec27b38 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-avoid-assignment.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-avoid-assignment.cpp @@ -10,6 +10,10 @@ struct S { S &operator=(S const &); S &operator=(S &&); S &operator+=(S); + S &operator++(); + S &operator++(int); + S &operator--(); + S &operator--(int); }; S returnValue(); @@ -27,4 +31,8 @@ void bar() { a.operator=(returnRef()); a += returnRef(); + a++; + ++a; + a--; + --a; } >From 784df684a08f4b4da97d8db9ba3bf708dafbf626 Mon Sep 17 00:00:00 2001 From: Congcong Cai <congcongcai0...@163.com> Date: Wed, 13 Mar 2024 14:31:36 +0800 Subject: [PATCH 2/2] better version --- .../bugprone/UnusedReturnValueCheck.cpp | 43 +++++++++++-------- .../unused-return-value-avoid-assignment.cpp | 4 ++ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp index 83b332fba1e2da..846505317c1c7a 100644 --- a/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/UnusedReturnValueCheck.cpp @@ -31,9 +31,20 @@ AST_MATCHER_P(FunctionDecl, isInstantiatedFrom, Matcher<FunctionDecl>, Finder, Builder); } -AST_MATCHER_P(CXXMethodDecl, isOperatorOverloading, - llvm::SmallVector<OverloadedOperatorKind>, Kinds) { - return llvm::is_contained(Kinds, Node.getOverloadedOperator()); +constexpr std::initializer_list<OverloadedOperatorKind> + AssignmentOverloadedOperatorKinds = { + OO_Equal, OO_PlusEqual, OO_MinusEqual, OO_StarEqual, + OO_SlashEqual, OO_PercentEqual, OO_CaretEqual, OO_AmpEqual, + OO_PipeEqual, OO_LessLessEqual, OO_GreaterGreaterEqual, OO_PlusPlus, + OO_MinusMinus}; + +AST_MATCHER(CXXOperatorCallExpr, isAssignmentOverloadedOperatorCall) { + return llvm::is_contained(AssignmentOverloadedOperatorKinds, + Node.getOperator()); +} +AST_MATCHER(CXXMethodDecl, isAssignmentOverloadedOperatorMethod) { + return llvm::is_contained(AssignmentOverloadedOperatorKinds, + Node.getOverloadedOperator()); } } // namespace @@ -165,20 +176,18 @@ void UnusedReturnValueCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { void UnusedReturnValueCheck::registerMatchers(MatchFinder *Finder) { auto MatchedDirectCallExpr = expr( - callExpr(callee(functionDecl( - // Don't match void overloads of checked functions. - unless(returns(voidType())), - // Don't match copy or move assignment operator. - unless(cxxMethodDecl(isOperatorOverloading( - {OO_Equal, OO_PlusEqual, OO_MinusEqual, OO_StarEqual, - OO_SlashEqual, OO_PercentEqual, OO_CaretEqual, - OO_AmpEqual, OO_PipeEqual, OO_LessLessEqual, - OO_GreaterGreaterEqual, OO_PlusPlus, OO_MinusMinus}))), - anyOf(isInstantiatedFrom( - matchers::matchesAnyListedName(CheckedFunctions)), - returns(hasCanonicalType(hasDeclaration( - namedDecl(matchers::matchesAnyListedName( - CheckedReturnTypes))))))))) + callExpr( + callee(functionDecl( + // Don't match void overloads of checked functions. + unless(returns(voidType())), + anyOf( + isInstantiatedFrom( + matchers::matchesAnyListedName(CheckedFunctions)), + returns(hasCanonicalType(hasDeclaration(namedDecl( + matchers::matchesAnyListedName(CheckedReturnTypes)))))))), + // Don't match copy or move assignment operator. + unless(cxxOperatorCallExpr(isAssignmentOverloadedOperatorCall())), + unless(callee(cxxMethodDecl(isAssignmentOverloadedOperatorMethod())))) .bind("match")); auto CheckCastToVoid = diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-avoid-assignment.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-avoid-assignment.cpp index 5809da9ec27b38..e7004f076228d2 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-avoid-assignment.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/unused-return-value-avoid-assignment.cpp @@ -16,6 +16,8 @@ struct S { S &operator--(int); }; +S &operator-=(S&, S); + S returnValue(); S const &returnRef(); @@ -31,6 +33,8 @@ void bar() { a.operator=(returnRef()); a += returnRef(); + a -= returnRef(); + a++; ++a; a--; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits