diff options
-rw-r--r-- | clang-tools-extra/clang-tidy/misc/AssertSideEffectCheck.cpp | 15 | ||||
-rw-r--r-- | clang-tools-extra/test/clang-tidy/misc-assert-side-effect.cpp | 11 |
2 files changed, 21 insertions, 5 deletions
diff --git a/clang-tools-extra/clang-tidy/misc/AssertSideEffectCheck.cpp b/clang-tools-extra/clang-tidy/misc/AssertSideEffectCheck.cpp index 6b93d9c9253..8d63ec5ece0 100644 --- a/clang-tools-extra/clang-tidy/misc/AssertSideEffectCheck.cpp +++ b/clang-tools-extra/clang-tidy/misc/AssertSideEffectCheck.cpp @@ -83,11 +83,18 @@ void AssertSideEffectCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { } void AssertSideEffectCheck::registerMatchers(MatchFinder *Finder) { - auto ConditionWithSideEffect = - hasCondition(hasDescendant(expr(hasSideEffect(CheckFunctionCalls)))); + auto DescendantWithSideEffect = + hasDescendant(expr(hasSideEffect(CheckFunctionCalls))); + auto ConditionWithSideEffect = hasCondition(DescendantWithSideEffect); Finder->addMatcher( - stmt(anyOf(conditionalOperator(ConditionWithSideEffect), - ifStmt(ConditionWithSideEffect))).bind("condStmt"), + stmt( + anyOf(conditionalOperator(ConditionWithSideEffect), + ifStmt(ConditionWithSideEffect), + unaryOperator(hasOperatorName("!"), + hasUnaryOperand(unaryOperator( + hasOperatorName("!"), + hasUnaryOperand(DescendantWithSideEffect)))))) + .bind("condStmt"), this); } diff --git a/clang-tools-extra/test/clang-tidy/misc-assert-side-effect.cpp b/clang-tools-extra/test/clang-tidy/misc-assert-side-effect.cpp index b4abadeb6cf..8cb4ebffa54 100644 --- a/clang-tools-extra/test/clang-tidy/misc-assert-side-effect.cpp +++ b/clang-tools-extra/test/clang-tidy/misc-assert-side-effect.cpp @@ -1,4 +1,4 @@ -// RUN: %check_clang_tidy %s misc-assert-side-effect %t -- -config="{CheckOptions: [{key: misc-assert-side-effect.CheckFunctionCalls, value: 1}, {key: misc-assert-side-effect.AssertMacros, value: 'assert,assert2,my_assert,convoluted_assert'}]}" -- -fexceptions +// RUN: %check_clang_tidy %s misc-assert-side-effect %t -- -config="{CheckOptions: [{key: misc-assert-side-effect.CheckFunctionCalls, value: 1}, {key: misc-assert-side-effect.AssertMacros, value: 'assert,assert2,my_assert,convoluted_assert,msvc_assert'}]}" -- -fexceptions //===--- assert definition block ------------------------------------------===// int abort() { return 0; } @@ -35,6 +35,12 @@ void print(...); #define wrap2(x) wrap1(x) #define convoluted_assert(x) wrap2(x) +#define msvc_assert(expression) (void)( \ + (!!(expression)) || \ + (abort(), 0) \ + ) + + //===----------------------------------------------------------------------===// class MyClass { @@ -101,5 +107,8 @@ int main() { assert2(1 == 2 - 1); + msvc_assert(mc2 = mc); + // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: found msvc_assert() with side effect + return 0; } |