https://github.com/schenker updated https://github.com/llvm/llvm-project/pull/71974
>From dabfdee1a982000605e4b33930ba433c63d1684f Mon Sep 17 00:00:00 2001 From: Thomas Schenker <thomas.schen...@protonmail.com> Date: Fri, 10 Nov 2023 18:58:26 +0100 Subject: [PATCH 1/2] [clang-tidy] bugprone-assert-side-effect non-const operator methods With this PR, `bugprone-assert-side-effect` assumes that operator methods that are not marked as `const` have side effects. This matches the existing rule for non-operator methods. E.g. the following snippet is now reported and was previously not: ``` std::stringstream ss; assert(ss << 1); ``` --- .../clang-tidy/bugprone/AssertSideEffectCheck.cpp | 4 ++++ .../checkers/bugprone/assert-side-effect.cpp | 13 ++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp index 07a987359d4d8d7..599f5ac70e7a229 100644 --- a/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp @@ -41,6 +41,10 @@ AST_MATCHER_P2(Expr, hasSideEffect, bool, CheckFunctionCalls, } if (const auto *OpCallExpr = dyn_cast<CXXOperatorCallExpr>(E)) { + if (const auto *FuncDecl = OpCallExpr->getDirectCallee()) + if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(FuncDecl)) + return !MethodDecl->isConst(); + OverloadedOperatorKind OpKind = OpCallExpr->getOperator(); return OpKind == OO_Equal || OpKind == OO_PlusEqual || OpKind == OO_MinusEqual || OpKind == OO_StarEqual || diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/assert-side-effect.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/assert-side-effect.cpp index 6c41e1e320adeac..49d3d456deb9d35 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/assert-side-effect.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/assert-side-effect.cpp @@ -11,7 +11,7 @@ class MyClass { MyClass &operator=(const MyClass &rhs) { return *this; } - int operator-() { return 1; } + int operator-() const { return 1; } operator bool() const { return true; } @@ -84,5 +84,16 @@ int main() { msvc_assert(mc2 = mc); // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: side effect in msvc_assert() condition discarded in release builds + struct { + int operator<<(int i) const { return i; } + } constOp; + assert(constOp << 1); + + struct { + int operator<<(int i) { return i; } + } nonConstOp; + assert(nonConstOp << 1); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: side effect in assert() condition discarded in release builds + return 0; } >From e71a99fcce8e05f198d356a03eb84bc82fcb8941 Mon Sep 17 00:00:00 2001 From: Thomas Schenker <thomas.schen...@protonmail.com> Date: Fri, 10 Nov 2023 21:07:39 +0100 Subject: [PATCH 2/2] use dyn_cast_or_null and add release note --- .../clang-tidy/bugprone/AssertSideEffectCheck.cpp | 6 +++--- clang-tools-extra/docs/ReleaseNotes.rst | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp index 599f5ac70e7a229..a6c01704b3d909f 100644 --- a/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/AssertSideEffectCheck.cpp @@ -41,9 +41,9 @@ AST_MATCHER_P2(Expr, hasSideEffect, bool, CheckFunctionCalls, } if (const auto *OpCallExpr = dyn_cast<CXXOperatorCallExpr>(E)) { - if (const auto *FuncDecl = OpCallExpr->getDirectCallee()) - if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(FuncDecl)) - return !MethodDecl->isConst(); + if (const auto *MethodDecl = + dyn_cast_or_null<CXXMethodDecl>(OpCallExpr->getDirectCallee())) + return !MethodDecl->isConst(); OverloadedOperatorKind OpKind = OpCallExpr->getOperator(); return OpKind == OO_Equal || OpKind == OO_PlusEqual || diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index c79aafdc0f06e69..4fa44ac473c5aff 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -208,6 +208,9 @@ New check aliases Changes in existing checks ^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Improved :doc:`bugprone-assert-side-effect + <clang-tidy/checks/bugprone/assert-side-effect>` check to report usage of non-const operator methods in assertions. + - Improved :doc:`bugprone-dangling-handle <clang-tidy/checks/bugprone/dangling-handle>` check to support functional casting during type conversions at variable initialization, now with improved _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits