1*89a1d03eSRichard // RUN: %check_clang_tidy %s bugprone-multiple-statement-macro %t 2*89a1d03eSRichard 3*89a1d03eSRichard void F(); 4*89a1d03eSRichard 5*89a1d03eSRichard #define BAD_MACRO(x) \ 6*89a1d03eSRichard F(); \ 7*89a1d03eSRichard F() 8*89a1d03eSRichard 9*89a1d03eSRichard #define GOOD_MACRO(x) \ 10*89a1d03eSRichard do { \ 11*89a1d03eSRichard F(); \ 12*89a1d03eSRichard F(); \ 13*89a1d03eSRichard } while (0) 14*89a1d03eSRichard 15*89a1d03eSRichard #define GOOD_MACRO2(x) F() 16*89a1d03eSRichard 17*89a1d03eSRichard #define GOOD_MACRO3(x) F(); 18*89a1d03eSRichard 19*89a1d03eSRichard #define MACRO_ARG_MACRO(X) \ 20*89a1d03eSRichard if (54) \ 21*89a1d03eSRichard X(2) 22*89a1d03eSRichard 23*89a1d03eSRichard #define ALL_IN_MACRO(X) \ 24*89a1d03eSRichard if (43) \ 25*89a1d03eSRichard F(); \ 26*89a1d03eSRichard F() 27*89a1d03eSRichard 28*89a1d03eSRichard #define GOOD_NESTED(x) \ 29*89a1d03eSRichard if (x) \ 30*89a1d03eSRichard GOOD_MACRO3(x); \ 31*89a1d03eSRichard F(); 32*89a1d03eSRichard 33*89a1d03eSRichard #define IF(x) if(x) 34*89a1d03eSRichard positives()35*89a1d03eSRichardvoid positives() { 36*89a1d03eSRichard if (1) 37*89a1d03eSRichard BAD_MACRO(1); 38*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used without braces; some statements will be unconditionally executed [bugprone-multiple-statement-macro] 39*89a1d03eSRichard if (1) { 40*89a1d03eSRichard } else 41*89a1d03eSRichard BAD_MACRO(1); 42*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used 43*89a1d03eSRichard while (1) 44*89a1d03eSRichard BAD_MACRO(1); 45*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used 46*89a1d03eSRichard for (;;) 47*89a1d03eSRichard BAD_MACRO(1); 48*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: multiple statement macro used 49*89a1d03eSRichard 50*89a1d03eSRichard MACRO_ARG_MACRO(BAD_MACRO); 51*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: multiple statement macro used 52*89a1d03eSRichard MACRO_ARG_MACRO(F(); int); 53*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: multiple statement macro used 54*89a1d03eSRichard IF(1) BAD_MACRO(1); 55*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: multiple statement macro used 56*89a1d03eSRichard } 57*89a1d03eSRichard negatives()58*89a1d03eSRichardvoid negatives() { 59*89a1d03eSRichard if (1) { 60*89a1d03eSRichard BAD_MACRO(1); 61*89a1d03eSRichard } else { 62*89a1d03eSRichard BAD_MACRO(1); 63*89a1d03eSRichard } 64*89a1d03eSRichard while (1) { 65*89a1d03eSRichard BAD_MACRO(1); 66*89a1d03eSRichard } 67*89a1d03eSRichard for (;;) { 68*89a1d03eSRichard BAD_MACRO(1); 69*89a1d03eSRichard } 70*89a1d03eSRichard 71*89a1d03eSRichard if (1) 72*89a1d03eSRichard GOOD_MACRO(1); 73*89a1d03eSRichard if (1) { 74*89a1d03eSRichard GOOD_MACRO(1); 75*89a1d03eSRichard } 76*89a1d03eSRichard if (1) 77*89a1d03eSRichard GOOD_MACRO2(1); 78*89a1d03eSRichard if (1) 79*89a1d03eSRichard GOOD_MACRO3(1); 80*89a1d03eSRichard 81*89a1d03eSRichard MACRO_ARG_MACRO(GOOD_MACRO); 82*89a1d03eSRichard ALL_IN_MACRO(1); 83*89a1d03eSRichard 84*89a1d03eSRichard IF(1) GOOD_MACRO(1); 85*89a1d03eSRichard } 86