Summary: clang_tidy/rename_check.py misc-assert-side-effect bugprone-assert-side-effect clang_tidy/rename_check.py misc-bool-pointer-implicit-conversion bugprone-bool-pointer-implicit-conversion clang_tidy/rename_check.py misc-fold-init-type bugprone-fold-init-type clang_tidy/rename_check.py misc-forward-declaration-namespace bugprone-forward-declaration-namespace clang_tidy/rename_check.py misc-inaccurate-erase bugprone-inaccurate-erase clang_tidy/rename_check.py misc-move-forwarding-reference bugprone-move-forwarding-reference clang_tidy/rename_check.py misc-multiple-statement-macro bugprone-multiple-statement-macro clang_tidy/rename_check.py misc-use-after-move bugprone-use-after-move clang_tidy/rename_check.py misc-virtual-near-miss bugprone-virtual-near-miss Manually fixed a reference to UseAfterMoveCheck in the hicpp module. Manually fixed header guards. Reviewers: hokein Reviewed By: hokein Subscribers: nemanjai, mgorny, javed.absar, xazax.hun, kbarton, cfe-commits Differential Revision: https://reviews.llvm.org/D40426 llvm-svn: 318950
86 lines
1.7 KiB
C++
86 lines
1.7 KiB
C++
// RUN: %check_clang_tidy %s bugprone-multiple-statement-macro %t
|
|
|
|
void F();
|
|
|
|
#define BAD_MACRO(x) \
|
|
F(); \
|
|
F()
|
|
|
|
#define GOOD_MACRO(x) \
|
|
do { \
|
|
F(); \
|
|
F(); \
|
|
} while (0)
|
|
|
|
#define GOOD_MACRO2(x) F()
|
|
|
|
#define GOOD_MACRO3(x) F();
|
|
|
|
#define MACRO_ARG_MACRO(X) \
|
|
if (54) \
|
|
X(2)
|
|
|
|
#define ALL_IN_MACRO(X) \
|
|
if (43) \
|
|
F(); \
|
|
F()
|
|
|
|
#define GOOD_NESTED(x) \
|
|
if (x) \
|
|
GOOD_MACRO3(x); \
|
|
F();
|
|
|
|
#define IF(x) if(x)
|
|
|
|
void positives() {
|
|
if (1)
|
|
BAD_MACRO(1);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used without braces; some statements will be unconditionally executed [bugprone-multiple-statement-macro]
|
|
if (1) {
|
|
} else
|
|
BAD_MACRO(1);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used
|
|
while (1)
|
|
BAD_MACRO(1);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used
|
|
for (;;)
|
|
BAD_MACRO(1);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used
|
|
|
|
MACRO_ARG_MACRO(BAD_MACRO);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: multiple statement macro used
|
|
MACRO_ARG_MACRO(F(); int);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: multiple statement macro used
|
|
IF(1) BAD_MACRO(1);
|
|
// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: multiple statement macro used
|
|
}
|
|
|
|
void negatives() {
|
|
if (1) {
|
|
BAD_MACRO(1);
|
|
} else {
|
|
BAD_MACRO(1);
|
|
}
|
|
while (1) {
|
|
BAD_MACRO(1);
|
|
}
|
|
for (;;) {
|
|
BAD_MACRO(1);
|
|
}
|
|
|
|
if (1)
|
|
GOOD_MACRO(1);
|
|
if (1) {
|
|
GOOD_MACRO(1);
|
|
}
|
|
if (1)
|
|
GOOD_MACRO2(1);
|
|
if (1)
|
|
GOOD_MACRO3(1);
|
|
|
|
MACRO_ARG_MACRO(GOOD_MACRO);
|
|
ALL_IN_MACRO(1);
|
|
|
|
IF(1) GOOD_MACRO(1);
|
|
}
|