|
1 |
| -// RUN: %clang_cc1 -std=c++17 -Wno-unused -ast-dump %s -ast-dump-filter Test | FileCheck %s |
| 1 | +// RUN: %clang_cc1 -std=c++17 -ast-dump %s -ast-dump-filter Test | FileCheck %s |
2 | 2 |
|
3 |
| -namespace Test { |
4 |
| - template<typename T, typename U> |
5 |
| - void Unary(T t, T* pt, T U::* mpt, T(&ft)(), T(&at)[4]) { |
6 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '*' cannot overflow |
7 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T' |
8 |
| - *t; |
| 3 | +struct A{}; |
9 | 4 |
|
10 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '+' cannot overflow |
11 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T' |
12 |
| - +t; |
| 5 | +template <typename T, typename U> |
| 6 | +auto Test(T* pt, U* pu) { |
| 7 | + // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '*' |
| 8 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
| 9 | + (void)*pt; |
13 | 10 |
|
14 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '-' cannot overflow |
15 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T' |
16 |
| - -t; |
| 11 | + // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '++' |
| 12 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
| 13 | + (void)(++pt); |
17 | 14 |
|
18 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '!' cannot overflow |
19 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T' |
20 |
| - !t; |
| 15 | + // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '+' |
| 16 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
| 17 | + (void)(+pt); |
21 | 18 |
|
22 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '~' cannot overflow |
23 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T' |
24 |
| - ~t; |
| 19 | + // CHECK: BinaryOperator {{.*}} '<dependent type>' '+' |
| 20 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
| 21 | + // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3 |
| 22 | + (void)(pt + 3); |
25 | 23 |
|
26 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow |
27 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T' |
28 |
| - &t; |
| 24 | + // CHECK: BinaryOperator {{.*}} '<dependent type>' '-' |
| 25 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
| 26 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
| 27 | + (void)(pt - pt); |
29 | 28 |
|
30 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '++' cannot overflow |
31 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T' |
32 |
| - ++t; |
| 29 | + // CHECK: BinaryOperator {{.*}} '<dependent type>' '-' |
| 30 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
| 31 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'U *' lvalue ParmVar {{.*}} 'pu' 'U *' |
| 32 | + (void)(pt - pu); |
33 | 33 |
|
34 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '--' cannot overflow |
35 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T' |
36 |
| - --t; |
| 34 | + // CHECK: BinaryOperator {{.*}} '<dependent type>' '==' |
| 35 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
| 36 | + // CHECK-NEXT: DeclRefExpr {{.*}} 'U *' lvalue ParmVar {{.*}} 'pu' 'U *' |
| 37 | + (void)(pt == pu); |
37 | 38 |
|
38 |
| - // CHECK: UnaryOperator {{.*}} 'T' lvalue prefix '*' cannot overflow |
39 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <LValueToRValue> |
40 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
41 |
| - *pt; |
| 39 | +} |
42 | 40 |
|
43 |
| - // CHECK: UnaryOperator {{.*}} 'T *' prefix '+' cannot overflow |
44 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <LValueToRValue> |
45 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
46 |
| - +pt; |
47 | 41 |
|
48 |
| - // CHECK: UnaryOperator {{.*}} 'bool' prefix '!' cannot overflow |
49 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'bool' <PointerToBoolean> |
50 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <LValueToRValue> |
51 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
52 |
| - !pt; |
53 |
| - |
54 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow |
55 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
56 |
| - &pt; |
57 |
| - |
58 |
| - // CHECK: UnaryOperator {{.*}} 'T *' lvalue prefix '++' cannot overflow |
59 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
60 |
| - ++pt; |
61 |
| - |
62 |
| - // CHECK: UnaryOperator {{.*}} 'T *' lvalue prefix '--' cannot overflow |
63 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
64 |
| - --pt; |
65 |
| - |
66 |
| - // CHECK: UnaryOperator {{.*}} 'bool' prefix '!' cannot overflow |
67 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'bool' <MemberPointerToBoolean> |
68 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T U::*' <LValueToRValue> |
69 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T U::*' lvalue ParmVar {{.*}} 'mpt' 'T U::*' |
70 |
| - !mpt; |
71 |
| - |
72 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow |
73 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T U::*' lvalue ParmVar {{.*}} 'mpt' 'T U::*' |
74 |
| - &mpt; |
75 |
| - |
76 |
| - // CHECK: UnaryOperator {{.*}} 'T ()' lvalue prefix '*' cannot overflow |
77 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T (*)()' <FunctionToPointerDecay> |
78 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T ()' lvalue ParmVar {{.*}} 'ft' 'T (&)()' |
79 |
| - *ft; |
80 |
| - |
81 |
| - // CHECK: UnaryOperator {{.*}} 'T (*)()' prefix '+' cannot overflow |
82 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T (*)()' <FunctionToPointerDecay> |
83 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T ()' lvalue ParmVar {{.*}} 'ft' 'T (&)()' |
84 |
| - +ft; |
85 |
| - |
86 |
| - // CHECK: UnaryOperator {{.*}} 'bool' prefix '!' cannot overflow |
87 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'bool' <PointerToBoolean> |
88 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T (*)()' <FunctionToPointerDecay> |
89 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T ()' lvalue ParmVar {{.*}} 'ft' 'T (&)()' |
90 |
| - !ft; |
91 |
| - |
92 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow |
93 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T ()' lvalue ParmVar {{.*}} 'ft' 'T (&)()' |
94 |
| - &ft; |
95 |
| - |
96 |
| - // CHECK: UnaryOperator {{.*}} 'T' lvalue prefix '*' cannot overflow |
97 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <ArrayToPointerDecay> |
98 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T[4]' lvalue ParmVar {{.*}} 'at' 'T (&)[4]' |
99 |
| - *at; |
100 |
| - |
101 |
| - // CHECK: UnaryOperator {{.*}} 'T *' prefix '+' cannot overflow |
102 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <ArrayToPointerDecay> |
103 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T[4]' lvalue ParmVar {{.*}} 'at' 'T (&)[4]' |
104 |
| - +at; |
105 |
| - |
106 |
| - // CHECK: UnaryOperator {{.*}} 'bool' prefix '!' cannot overflow |
107 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'bool' <PointerToBoolean> |
108 |
| - // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <ArrayToPointerDecay> |
109 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T[4]' lvalue ParmVar {{.*}} 'at' 'T (&)[4]' |
110 |
| - !at; |
111 |
| - |
112 |
| - // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow |
113 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T[4]' lvalue ParmVar {{.*}} 'at' 'T (&)[4]' |
114 |
| - &at; |
115 |
| - } |
116 |
| - |
117 |
| - template<typename T, typename U> |
118 |
| - void Binary(T* pt, U* pu) { |
119 |
| - // CHECK: BinaryOperator {{.*}} '<dependent type>' '+' |
120 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
121 |
| - // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3 |
122 |
| - pt + 3; |
123 |
| - |
124 |
| - // CHECK: BinaryOperator {{.*}} '<dependent type>' '-' |
125 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
126 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
127 |
| - pt - pt; |
128 |
| - |
129 |
| - // CHECK: BinaryOperator {{.*}} '<dependent type>' '-' |
130 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
131 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'U *' lvalue ParmVar {{.*}} 'pu' 'U *' |
132 |
| - pt - pu; |
133 |
| - |
134 |
| - // CHECK: BinaryOperator {{.*}} '<dependent type>' '==' |
135 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *' |
136 |
| - // CHECK-NEXT: DeclRefExpr {{.*}} 'U *' lvalue ParmVar {{.*}} 'pu' 'U *' |
137 |
| - pt == pu; |
138 |
| - } |
139 |
| -} // namespace Test |
0 commit comments