xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/bugprone/multiple-statement-macro.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
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*89a1d03eSRichard void 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*89a1d03eSRichard void 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