Clang Project

clang_source_code/test/CodeCompletion/member-access.cpp
1struct Base1 {
2  int member1;
3  float member2;
4};
5
6struct Base2 {
7  int member1;
8  double member3;
9  void memfun1(int);
10};
11
12struct Base3 : Base1, Base2 {
13  void memfun1(float);
14  void memfun1(double) const;
15  void memfun2(int);
16};
17
18struct Derived : Base3 {
19  template <typename T> Derived(T);
20  Derived(int);
21  int member4;
22  int memfun3(int);
23};
24
25class Proxy {
26public:
27  Derived *operator->() const;
28};
29
30void test(const Proxy &p) {
31  p->
32}
33
34struct 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
42struct Foo {
43  void foo() const;
44  static void foo(bool);
45};
46
47struct 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
73template<typename T>
74class BaseTemplate {
75public:
76  T baseTemplateFunction();
77
78  T baseTemplateField;
79};
80
81template<typename T, typename S>
82class TemplateClass: public Base1 , public BaseTemplate<T> {
83public:
84  T function() { }
85  T field;
86
87  void overload1(const T &);
88  void overload1(const S &);
89};
90
91template<typename T, typename S>
92void 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
110void 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
127template <typename T>
128class Template {
129public:
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
156template<typename T>
157void 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
170class Proxy2 {
171public:
172  Derived *operator->() const;
173  int member5;
174};
175
176void test2(const Proxy2 &p) {
177  p->
178}
179
180void 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