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