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 | |