// 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);
}