xref: /llvm-project/clang/test/CXX/over/over.built/ast.cpp (revision 1595988ee6f9732e7ea79928af8a470ad5ef7dbe)
1 // RUN: %clang_cc1 -std=c++17 -Wno-unused -ast-dump %s -ast-dump-filter Test | FileCheck %s
2 
3 namespace Test {
4   template<typename T, typename U>
Unary(T t,T * pt,T U::* mpt,T (& ft)(),T (& at)[4])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;
9 
10     // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '+' cannot overflow
11     // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'
12     +t;
13 
14     // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '-' cannot overflow
15     // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'
16     -t;
17 
18     // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '!' cannot overflow
19     // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'
20     !t;
21 
22     // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '~' cannot overflow
23     // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'
24     ~t;
25 
26     // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow
27     // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'
28     &t;
29 
30     // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '++' cannot overflow
31     // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'
32     ++t;
33 
34     // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '--' cannot overflow
35     // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'
36     --t;
37 
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;
42 
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 
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>
Binary(T * pt,U * pu)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
140