forked from OSchip/llvm-project
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);
|
|
}
|