1 // RUN: %check_clang_tidy %s bugprone-macro-parentheses %t
2 
3 #define BAD1              -1
4 // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: macro replacement list should be enclosed in parentheses [bugprone-macro-parentheses]
5 #define BAD2              1+2
6 // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: macro replacement list should be enclosed in parentheses [bugprone-macro-parentheses]
7 #define BAD3(A)           (A+1)
8 // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: macro argument should be enclosed in parentheses [bugprone-macro-parentheses]
9 #define BAD4(x)           ((unsigned char)(x & 0xff))
10 // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: macro argument should be enclosed in parentheses [bugprone-macro-parentheses]
11 #define BAD5(X)           A*B=(C*)X+2
12 // CHECK-MESSAGES: :[[@LINE-1]]:35: warning: macro argument should be enclosed in parentheses [bugprone-macro-parentheses]
13 #define BAD6(x)           goto *x;
14 // CHECK-MESSAGES: :[[@LINE-1]]:33: warning: macro argument should be enclosed in parentheses [bugprone-macro-parentheses]
15 #define BAD7(x, y)        if (x) goto y; else x;
16 // CHECK-MESSAGES: :[[@LINE-1]]:47: warning: macro argument should be enclosed in parentheses [bugprone-macro-parentheses]
17 
18 #define GOOD1             1
19 #define GOOD2             (1+2)
20 #define GOOD3(A)          #A
21 #define GOOD4(A,B)        A ## B
22 #define GOOD5(T)          ((T*)0)
23 #define GOOD6(B)          "A" B "C"
24 #define GOOD7(b)          A b
25 #define GOOD8(a)          a B
26 #define GOOD9(type)       (type(123))
27 #define GOOD10(car, ...)  car
28 #define GOOD11            a[b+c]
29 #define GOOD12(x)         a[x]
30 #define GOOD13(x)         a.x
31 #define GOOD14(x)         a->x
32 #define GOOD15(x)         ({ int a = x; a+4; })
33 #define GOOD16(x)         a_ ## x, b_ ## x = c_ ## x - 1,
34 #define GOOD17            case 123: x=4+5; break;
35 #define GOOD18(x)         ;x;
36 #define GOOD19            ;-2;
37 #define GOOD20            void*
38 #define GOOD21(a)         case Fred::a:
39 #define GOOD22(a)         if (verbose) return a;
40 #define GOOD23(type)      (type::Field)
41 #define GOOD24(t)         std::set<t> s
42 #define GOOD25(t)         std::set<t,t,t> s
43 #define GOOD26(x)         (a->*x)
44 #define GOOD27(x)         (a.*x)
45 #define GOOD28(x)         namespace x {int b;}
46 #define GOOD29(...)       std::cout << __VA_ARGS__;
47 #define GOOD30(args...)   std::cout << args;
48 #define GOOD31(X)         A*X=2
49 #define GOOD32(X)         std::vector<X>
50 #define GOOD33(x)         if (!a__##x) a_##x = &f(#x)
51 #define GOOD34(x, y)      if (x) goto y;
52 #define GOOD35(x, y)      if (x) goto *(y);
53 
54 // These are allowed for now..
55 #define MAYBE1            *12.34
56 #define MAYBE2            <<3
57