1 struct Base1 {
2   int member1;
3   float member2;
4 };
5 
6 struct Base2 {
7   int member1;
8   double member3;
9   void memfun1(int);
10 };
11 
12 struct Base3 : Base1, Base2 {
13   void memfun1(float);
14   void memfun1(double) const;
15   void memfun2(int);
16 };
17 
18 struct Derived : Base3 {
19   template <typename T> Derived(T);
20   Derived(int);
21   int member4;
22   int memfun3(int);
23 };
24 
25 class Proxy {
26 public:
27   Derived *operator->() const;
28 };
29 
30 void test(const Proxy &p) {
31   p->
32 }
33 
34 struct Test1 {
35   Base1 b;
36 
37   static void sfunc() {
38     b. // expected-error {{invalid use of member 'b' in static member function}}
39   }
40 };
41 
42 struct Foo {
43   void foo() const;
44   static void foo(bool);
45 };
46 
47 struct Bar {
48   void foo(bool param) {
49     Foo::foo(  );// unresolved member expression with an implicit base
50   }
51 };
52 
53   // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:31:6 %s -o - | FileCheck -check-prefix=CHECK-CC1 --implicit-check-not="Derived : Derived(" %s
54   // CHECK-CC1: Base1 (InBase) : Base1::
55   // CHECK-CC1: member1 (InBase) : [#int#][#Base1::#]member1
56   // CHECK-CC1: member1 (InBase) : [#int#][#Base2::#]member1
57   // CHECK-CC1: member2 (InBase) : [#float#][#Base1::#]member2
58   // CHECK-CC1: member3 (InBase)
59   // CHECK-CC1: member4
60   // CHECK-CC1: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#float#>)
61   // CHECK-CC1: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#double#>)[# const#]
62   // CHECK-CC1: memfun1 (Hidden,InBase) : [#void#]Base2::memfun1(<#int#>)
63   // CHECK-CC1: memfun2 (InBase) : [#void#][#Base3::#]memfun2(<#int#>)
64   // CHECK-CC1: memfun3 : [#int#]memfun3(<#int#>)
65 
66 // Make sure this doesn't crash
67 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:38:7 %s -verify
68 
69 // Make sure this also doesn't crash
70 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:49:14 %s
71 
72 
73 template<typename T>
74 class BaseTemplate {
75 public:
76   T baseTemplateFunction();
77 
78   T baseTemplateField;
79 };
80 
81 template<typename T, typename S>
82 class TemplateClass: public Base1 , public BaseTemplate<T> {
83 public:
84   T function() { }
85   T field;
86 
87   void overload1(const T &);
88   void overload1(const S &);
89 };
90 
91 template<typename T, typename S>
92 void completeDependentMembers(TemplateClass<T, S> &object,
93                               TemplateClass<int, S> *object2) {
94   object.field;
95   object2->field;
96 // CHECK-CC2: baseTemplateField (InBase) : [#T#][#BaseTemplate<T>::#]baseTemplateField
97 // CHECK-CC2: baseTemplateFunction (InBase) : [#T#][#BaseTemplate<T>::#]baseTemplateFunction()
98 // CHECK-CC2: field : [#T#]field
99 // CHECK-CC2: function : [#T#]function()
100 // CHECK-CC2: member1 (InBase) : [#int#][#Base1::#]member1
101 // CHECK-CC2: member2 (InBase) : [#float#][#Base1::#]member2
102 // CHECK-CC2: overload1 : [#void#]overload1(<#const T &#>)
103 // CHECK-CC2: overload1 : [#void#]overload1(<#const S &#>)
104 
105 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:94:10 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
106 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:95:12 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
107 }
108 
109 
110 void completeDependentSpecializedMembers(TemplateClass<int, double> &object,
111                                          TemplateClass<int, double> *object2) {
112   object.field;
113   object2->field;
114 // CHECK-CC3: baseTemplateField (InBase) : [#int#][#BaseTemplate<int>::#]baseTemplateField
115 // CHECK-CC3: baseTemplateFunction (InBase) : [#int#][#BaseTemplate<int>::#]baseTemplateFunction()
116 // CHECK-CC3: field : [#int#]field
117 // CHECK-CC3: function : [#int#]function()
118 // CHECK-CC3: member1 (InBase) : [#int#][#Base1::#]member1
119 // CHECK-CC3: member2 (InBase) : [#float#][#Base1::#]member2
120 // CHECK-CC3: overload1 : [#void#]overload1(<#const int &#>)
121 // CHECK-CC3: overload1 : [#void#]overload1(<#const double &#>)
122 
123 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:112:10 %s -o - | FileCheck -check-prefix=CHECK-CC3 %s
124 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:113:12 %s -o - | FileCheck -check-prefix=CHECK-CC3 %s
125 }
126 
127 template <typename T>
128 class Template {
129 public:
130   BaseTemplate<int> o1;
131   BaseTemplate<T> o2;
132 
133   void function() {
134     o1.baseTemplateField;
135 // CHECK-CC4: BaseTemplate : BaseTemplate::
136 // CHECK-CC4: baseTemplateField : [#int#]baseTemplateField
137 // CHECK-CC4: baseTemplateFunction : [#int#]baseTemplateFunction()
138 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:134:8 %s -o - | FileCheck -check-prefix=CHECK-CC4 %s
139     o2.baseTemplateField;
140 // CHECK-CC5: BaseTemplate : BaseTemplate::
141 // CHECK-CC5: baseTemplateField : [#T#]baseTemplateField
142 // CHECK-CC5: baseTemplateFunction : [#T#]baseTemplateFunction()
143 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:139:8 %s -o - | FileCheck -check-prefix=CHECK-CC5 %s
144     this->o1;
145 // CHECK-CC6: [#void#]function()
146 // CHECK-CC6: o1 : [#BaseTemplate<int>#]o1
147 // CHECK-CC6: o2 : [#BaseTemplate<T>#]o2
148 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:144:11 %s -o - | FileCheck -check-prefix=CHECK-CC6 %s
149   }
150 
151   static void staticFn(T &obj);
152 
153   struct Nested { };
154 };
155 
156 template<typename T>
157 void dependentColonColonCompletion() {
158   Template<T>::staticFn();
159 // CHECK-CC7: function : [#void#]function()
160 // CHECK-CC7: Nested : Nested
161 // CHECK-CC7: o1 : [#BaseTemplate<int>#]o1
162 // CHECK-CC7: o2 : [#BaseTemplate<T>#]o2
163 // CHECK-CC7: staticFn : [#void#]staticFn(<#T &obj#>)
164 // CHECK-CC7: Template : Template
165 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:158:16 %s -o - | FileCheck -check-prefix=CHECK-CC7 %s
166   typename Template<T>::Nested m;
167 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:166:25 %s -o - | FileCheck -check-prefix=CHECK-CC7 %s
168 }
169 
170 class Proxy2 {
171 public:
172   Derived *operator->() const;
173   int member5;
174 };
175 
176 void test2(const Proxy2 &p) {
177   p->
178 }
179 
180 void test3(const Proxy2 &p) {
181   p.
182 }
183 
184 // RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:177:6 %s -o - | FileCheck -check-prefix=CHECK-CC8 --implicit-check-not="Derived : Derived(" %s
185 // CHECK-CC8: Base1 (InBase) : Base1::
186 // CHECK-CC8: member1 (InBase) : [#int#][#Base1::#]member1
187 // CHECK-CC8: member1 (InBase) : [#int#][#Base2::#]member1
188 // CHECK-CC8: member2 (InBase) : [#float#][#Base1::#]member2
189 // CHECK-CC8: member3 (InBase) : [#double#][#Base2::#]member3
190 // CHECK-CC8: member4 : [#int#]member4
191 // CHECK-CC8: member5 : [#int#]member5 (requires fix-it: {177:4-177:6} to ".")
192 // CHECK-CC8: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#float#>)
193 // CHECK-CC8: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#double#>)[# const#]
194 // CHECK-CC8: memfun1 (Hidden,InBase) : [#void#]Base2::memfun1(<#int#>)
195 // CHECK-CC8: memfun2 (InBase) : [#void#][#Base3::#]memfun2(<#int#>)
196 // CHECK-CC8: memfun3 : [#int#]memfun3(<#int#>)
197 // CHECK-CC8: operator-> : [#Derived *#]operator->()[# const#] (requires fix-it: {177:4-177:6} to ".")
198 
199 // RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:181:6 %s -o - | FileCheck -check-prefix=CHECK-CC9 --implicit-check-not="Derived : Derived(" %s
200 // CHECK-CC9: Base1 (InBase) : Base1::
201 // CHECK-CC9: member1 (InBase) : [#int#][#Base1::#]member1 (requires fix-it: {181:4-181:5} to "->")
202 // CHECK-CC9: member1 (InBase) : [#int#][#Base2::#]member1 (requires fix-it: {181:4-181:5} to "->")
203 // CHECK-CC9: member2 (InBase) : [#float#][#Base1::#]member2 (requires fix-it: {181:4-181:5} to "->")
204 // CHECK-CC9: member3 (InBase) : [#double#][#Base2::#]member3 (requires fix-it: {181:4-181:5} to "->")
205 // CHECK-CC9: member4 : [#int#]member4 (requires fix-it: {181:4-181:5} to "->")
206 // CHECK-CC9: member5 : [#int#]member5
207 // CHECK-CC9: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#float#>) (requires fix-it: {181:4-181:5} to "->")
208 // CHECK-CC9: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#double#>)[# const#] (requires fix-it: {181:4-181:5} to "->")
209 // CHECK-CC9: memfun1 (Hidden,InBase) : [#void#]Base2::memfun1(<#int#>) (requires fix-it: {181:4-181:5} to "->")
210 // CHECK-CC9: memfun2 (InBase) : [#void#][#Base3::#]memfun2(<#int#>) (requires fix-it: {181:4-181:5} to "->")
211 // CHECK-CC9: memfun3 : [#int#]memfun3(<#int#>) (requires fix-it: {181:4-181:5} to "->")
212 // CHECK-CC9: operator-> : [#Derived *#]operator->()[# const#]
213 
214 // These overload sets differ only by return type and this-qualifiers.
215 // So for any given callsite, only one is available.
216 struct Overloads {
217   double ConstOverload(char);
218   int ConstOverload(char) const;
219 
220   int RefOverload(char) &;
221   double RefOverload(char) const&;
222   char RefOverload(char) &&;
223 };
224 void testLValue(Overloads& Ref) {
225   Ref.
226 }
227 void testConstLValue(const Overloads& ConstRef) {
228   ConstRef.
229 }
230 void testRValue() {
231   Overloads().
232 }
233 void testXValue(Overloads& X) {
234   static_cast<Overloads&&>(X).
235 }
236 
237 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:225:7 %s -o - | FileCheck -check-prefix=CHECK-LVALUE %s \
238 // RUN: --implicit-check-not="[#int#]ConstOverload(" \
239 // RUN: --implicit-check-not="[#double#]RefOverload(" \
240 // RUN: --implicit-check-not="[#char#]RefOverload("
241 // CHECK-LVALUE-DAG: [#double#]ConstOverload(
242 // CHECK-LVALUE-DAG: [#int#]RefOverload(
243 
244 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:228:12 %s -o - | FileCheck -check-prefix=CHECK-CONSTLVALUE %s \
245 // RUN: --implicit-check-not="[#double#]ConstOverload(" \
246 // RUN: --implicit-check-not="[#int#]RefOverload(" \
247 // RUN: --implicit-check-not="[#char#]RefOverload("
248 // CHECK-CONSTLVALUE: [#int#]ConstOverload(
249 // CHECK-CONSTLVALUE: [#double#]RefOverload(
250 
251 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:231:15 %s -o - | FileCheck -check-prefix=CHECK-PRVALUE %s \
252 // RUN: --implicit-check-not="[#int#]ConstOverload(" \
253 // RUN: --implicit-check-not="[#int#]RefOverload(" \
254 // RUN: --implicit-check-not="[#double#]RefOverload("
255 // CHECK-PRVALUE: [#double#]ConstOverload(
256 // CHECK-PRVALUE: [#char#]RefOverload(
257 
258 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:234:31 %s -o - | FileCheck -check-prefix=CHECK-XVALUE %s \
259 // RUN: --implicit-check-not="[#int#]ConstOverload(" \
260 // RUN: --implicit-check-not="[#int#]RefOverload(" \
261 // RUN: --implicit-check-not="[#double#]RefOverload("
262 // CHECK-XVALUE: [#double#]ConstOverload(
263 // CHECK-XVALUE: [#char#]RefOverload(
264 
265 void testOverloadOperator() {
266   struct S {
267     char operator=(int) const;
268     int operator=(int);
269   } s;
270   return s.
271 }
272 // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:270:12 %s -o - | FileCheck -check-prefix=CHECK-OPER %s \
273 // RUN: --implicit-check-not="[#char#]operator=("
274 // CHECK-OPER: [#int#]operator=(
275 
276 struct S { int member; };
277 S overloaded(int);
278 S overloaded(double);
279 void foo() {
280   // No overload matches, but we have recovery-expr with the correct type.
281   overloaded().
282 }
283 // RUN: not %clang_cc1 -fsyntax-only -frecovery-ast -frecovery-ast-type -code-completion-at=%s:281:16 %s -o - | FileCheck -check-prefix=CHECK-RECOVERY %s
284 // CHECK-RECOVERY: [#int#]member
285