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