12436e711SDouglas Gregor struct Base1 {
22436e711SDouglas Gregor int member1;
32436e711SDouglas Gregor float member2;
42436e711SDouglas Gregor };
52436e711SDouglas Gregor
62436e711SDouglas Gregor struct Base2 {
72436e711SDouglas Gregor int member1;
82436e711SDouglas Gregor double member3;
92436e711SDouglas Gregor void memfun1(int);
102436e711SDouglas Gregor };
112436e711SDouglas Gregor
122436e711SDouglas Gregor struct Base3 : Base1, Base2 {
132436e711SDouglas Gregor void memfun1(float);
140f622367SDouglas Gregor void memfun1(double) const;
152436e711SDouglas Gregor void memfun2(int);
162436e711SDouglas Gregor };
172436e711SDouglas Gregor
182436e711SDouglas Gregor struct Derived : Base3 {
1963c59720SSam McCall template <typename T> Derived(T);
2063c59720SSam McCall Derived(int);
212436e711SDouglas Gregor int member4;
222436e711SDouglas Gregor int memfun3(int);
232436e711SDouglas Gregor };
242436e711SDouglas Gregor
252436e711SDouglas Gregor class Proxy {
262436e711SDouglas Gregor public:
272436e711SDouglas Gregor Derived *operator->() const;
282436e711SDouglas Gregor };
292436e711SDouglas Gregor
test(const Proxy & p)302436e711SDouglas Gregor void test(const Proxy &p) {
31ea9b03e6SDouglas Gregor p->
320516803cSArgyrios Kyrtzidis }
330516803cSArgyrios Kyrtzidis
340516803cSArgyrios Kyrtzidis struct Test1 {
350516803cSArgyrios Kyrtzidis Base1 b;
360516803cSArgyrios Kyrtzidis
sfuncTest1370516803cSArgyrios Kyrtzidis static void sfunc() {
380516803cSArgyrios Kyrtzidis b. // expected-error {{invalid use of member 'b' in static member function}}
390516803cSArgyrios Kyrtzidis }
400516803cSArgyrios Kyrtzidis };
410516803cSArgyrios Kyrtzidis
42f1898cfaSErik Verbruggen struct Foo {
43f1898cfaSErik Verbruggen void foo() const;
44f1898cfaSErik Verbruggen static void foo(bool);
45f1898cfaSErik Verbruggen };
46f1898cfaSErik Verbruggen
47f1898cfaSErik Verbruggen struct Bar {
fooBar48f1898cfaSErik Verbruggen void foo(bool param) {
49f1898cfaSErik Verbruggen Foo::foo( );// unresolved member expression with an implicit base
50f1898cfaSErik Verbruggen }
51f1898cfaSErik Verbruggen };
52f1898cfaSErik Verbruggen
5363c59720SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:31:6 %s -o - | FileCheck -check-prefix=CHECK-CC1 --implicit-check-not="Derived : Derived(" %s
544a7cd637SEric Liu // CHECK-CC1: Base1 (InBase) : Base1::
554a7cd637SEric Liu // CHECK-CC1: member1 (InBase) : [#int#][#Base1::#]member1
564a7cd637SEric Liu // CHECK-CC1: member1 (InBase) : [#int#][#Base2::#]member1
574a7cd637SEric Liu // CHECK-CC1: member2 (InBase) : [#float#][#Base1::#]member2
584a7cd637SEric Liu // CHECK-CC1: member3 (InBase)
5952ce62f0SDouglas Gregor // CHECK-CC1: member4
604a7cd637SEric Liu // CHECK-CC1: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#float#>)
614a7cd637SEric Liu // CHECK-CC1: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#double#>)[# const#]
624a7cd637SEric Liu // CHECK-CC1: memfun1 (Hidden,InBase) : [#void#]Base2::memfun1(<#int#>)
634a7cd637SEric Liu // CHECK-CC1: memfun2 (InBase) : [#void#][#Base3::#]memfun2(<#int#>)
6452ce62f0SDouglas Gregor // CHECK-CC1: memfun3 : [#int#]memfun3(<#int#>)
65ea9b03e6SDouglas Gregor
660516803cSArgyrios Kyrtzidis // Make sure this doesn't crash
6763c59720SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:38:7 %s -verify
68f1898cfaSErik Verbruggen
69f1898cfaSErik Verbruggen // Make sure this also doesn't crash
7063c59720SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:49:14 %s
71e6afa397SAlex Lorenz
72e6afa397SAlex Lorenz
73e6afa397SAlex Lorenz template<typename T>
74e6afa397SAlex Lorenz class BaseTemplate {
75e6afa397SAlex Lorenz public:
76e6afa397SAlex Lorenz T baseTemplateFunction();
77e6afa397SAlex Lorenz
78e6afa397SAlex Lorenz T baseTemplateField;
79e6afa397SAlex Lorenz };
80e6afa397SAlex Lorenz
81e6afa397SAlex Lorenz template<typename T, typename S>
82e6afa397SAlex Lorenz class TemplateClass: public Base1 , public BaseTemplate<T> {
83e6afa397SAlex Lorenz public:
function()84e6afa397SAlex Lorenz T function() { }
85e6afa397SAlex Lorenz T field;
86e6afa397SAlex Lorenz
875c55d374SSam McCall TemplateClass<S, T> &relatedField;
885c55d374SSam McCall BaseTemplate<S> &relatedFunction();
895c55d374SSam McCall
90e6afa397SAlex Lorenz void overload1(const T &);
91e6afa397SAlex Lorenz void overload1(const S &);
92e6afa397SAlex Lorenz };
93e6afa397SAlex Lorenz
94e6afa397SAlex Lorenz template<typename T, typename S>
completeDependentMembers(TemplateClass<T,S> & object,TemplateClass<int,S> * object2)95e6afa397SAlex Lorenz void completeDependentMembers(TemplateClass<T, S> &object,
96e6afa397SAlex Lorenz TemplateClass<int, S> *object2) {
97e6afa397SAlex Lorenz object.field;
98e6afa397SAlex Lorenz object2->field;
994a7cd637SEric Liu // CHECK-CC2: baseTemplateField (InBase) : [#T#][#BaseTemplate<T>::#]baseTemplateField
1004a7cd637SEric Liu // CHECK-CC2: baseTemplateFunction (InBase) : [#T#][#BaseTemplate<T>::#]baseTemplateFunction()
101e6afa397SAlex Lorenz // CHECK-CC2: field : [#T#]field
102e6afa397SAlex Lorenz // CHECK-CC2: function : [#T#]function()
1034a7cd637SEric Liu // CHECK-CC2: member1 (InBase) : [#int#][#Base1::#]member1
1044a7cd637SEric Liu // CHECK-CC2: member2 (InBase) : [#float#][#Base1::#]member2
105e6afa397SAlex Lorenz // CHECK-CC2: overload1 : [#void#]overload1(<#const T &#>)
106e6afa397SAlex Lorenz // CHECK-CC2: overload1 : [#void#]overload1(<#const S &#>)
107e6afa397SAlex Lorenz
1085c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:97:10 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
1095c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:98:12 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
1105c55d374SSam McCall
1115c55d374SSam McCall object.relatedField.relatedFunction().baseTemplateField;
1125c55d374SSam McCall // CHECK-DEP-CHAIN: baseTemplateField : [#T#]baseTemplateField
1135c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:111:41 %s -o - | FileCheck -check-prefix=CHECK-DEP-CHAIN %s
114e6afa397SAlex Lorenz }
115e6afa397SAlex Lorenz
116e6afa397SAlex Lorenz
completeDependentSpecializedMembers(TemplateClass<int,double> & object,TemplateClass<int,double> * object2)117e6afa397SAlex Lorenz void completeDependentSpecializedMembers(TemplateClass<int, double> &object,
118e6afa397SAlex Lorenz TemplateClass<int, double> *object2) {
119e6afa397SAlex Lorenz object.field;
120e6afa397SAlex Lorenz object2->field;
1214a7cd637SEric Liu // CHECK-CC3: baseTemplateField (InBase) : [#int#][#BaseTemplate<int>::#]baseTemplateField
1224a7cd637SEric Liu // CHECK-CC3: baseTemplateFunction (InBase) : [#int#][#BaseTemplate<int>::#]baseTemplateFunction()
123e6afa397SAlex Lorenz // CHECK-CC3: field : [#int#]field
124e6afa397SAlex Lorenz // CHECK-CC3: function : [#int#]function()
1254a7cd637SEric Liu // CHECK-CC3: member1 (InBase) : [#int#][#Base1::#]member1
1264a7cd637SEric Liu // CHECK-CC3: member2 (InBase) : [#float#][#Base1::#]member2
127e6afa397SAlex Lorenz // CHECK-CC3: overload1 : [#void#]overload1(<#const int &#>)
128e6afa397SAlex Lorenz // CHECK-CC3: overload1 : [#void#]overload1(<#const double &#>)
129e6afa397SAlex Lorenz
1305c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:119:10 %s -o - | FileCheck -check-prefix=CHECK-CC3 %s
1315c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:120:12 %s -o - | FileCheck -check-prefix=CHECK-CC3 %s
132e6afa397SAlex Lorenz }
133e6afa397SAlex Lorenz
134e6afa397SAlex Lorenz template <typename T>
135e6afa397SAlex Lorenz class Template {
136e6afa397SAlex Lorenz public:
137e6afa397SAlex Lorenz BaseTemplate<int> o1;
138e6afa397SAlex Lorenz BaseTemplate<T> o2;
139e6afa397SAlex Lorenz
function()140e6afa397SAlex Lorenz void function() {
141e6afa397SAlex Lorenz o1.baseTemplateField;
142e6afa397SAlex Lorenz // CHECK-CC4: BaseTemplate : BaseTemplate::
143e6afa397SAlex Lorenz // CHECK-CC4: baseTemplateField : [#int#]baseTemplateField
144e6afa397SAlex Lorenz // CHECK-CC4: baseTemplateFunction : [#int#]baseTemplateFunction()
1455c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:141:8 %s -o - | FileCheck -check-prefix=CHECK-CC4 %s
146e6afa397SAlex Lorenz o2.baseTemplateField;
147e6afa397SAlex Lorenz // CHECK-CC5: BaseTemplate : BaseTemplate::
148e6afa397SAlex Lorenz // CHECK-CC5: baseTemplateField : [#T#]baseTemplateField
149e6afa397SAlex Lorenz // CHECK-CC5: baseTemplateFunction : [#T#]baseTemplateFunction()
1505c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:146:8 %s -o - | FileCheck -check-prefix=CHECK-CC5 %s
151e6afa397SAlex Lorenz this->o1;
152e6afa397SAlex Lorenz // CHECK-CC6: [#void#]function()
153e6afa397SAlex Lorenz // CHECK-CC6: o1 : [#BaseTemplate<int>#]o1
154e6afa397SAlex Lorenz // CHECK-CC6: o2 : [#BaseTemplate<T>#]o2
1555c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:151:11 %s -o - | FileCheck -check-prefix=CHECK-CC6 %s
156e6afa397SAlex Lorenz }
1578a7a4cfaSAlex Lorenz
1588a7a4cfaSAlex Lorenz static void staticFn(T &obj);
1598a7a4cfaSAlex Lorenz
1608a7a4cfaSAlex Lorenz struct Nested { };
161e6afa397SAlex Lorenz };
1628a7a4cfaSAlex Lorenz
1638a7a4cfaSAlex Lorenz template<typename T>
dependentColonColonCompletion()1648a7a4cfaSAlex Lorenz void dependentColonColonCompletion() {
1658a7a4cfaSAlex Lorenz Template<T>::staticFn();
1668a7a4cfaSAlex Lorenz // CHECK-CC7: function : [#void#]function()
1678a7a4cfaSAlex Lorenz // CHECK-CC7: Nested : Nested
1688a7a4cfaSAlex Lorenz // CHECK-CC7: o1 : [#BaseTemplate<int>#]o1
1698a7a4cfaSAlex Lorenz // CHECK-CC7: o2 : [#BaseTemplate<T>#]o2
1708a7a4cfaSAlex Lorenz // CHECK-CC7: staticFn : [#void#]staticFn(<#T &obj#>)
1718a7a4cfaSAlex Lorenz // CHECK-CC7: Template : Template
1725c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:165:16 %s -o - | FileCheck -check-prefix=CHECK-CC7 %s
1738a7a4cfaSAlex Lorenz typename Template<T>::Nested m;
1745c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:173:25 %s -o - | FileCheck -check-prefix=CHECK-CC7 %s
1758a7a4cfaSAlex Lorenz }
176b4670fc7SIvan Donchevskii
177b4670fc7SIvan Donchevskii class Proxy2 {
178b4670fc7SIvan Donchevskii public:
179b4670fc7SIvan Donchevskii Derived *operator->() const;
180b4670fc7SIvan Donchevskii int member5;
181b4670fc7SIvan Donchevskii };
182b4670fc7SIvan Donchevskii
test2(const Proxy2 & p)183b4670fc7SIvan Donchevskii void test2(const Proxy2 &p) {
184b4670fc7SIvan Donchevskii p->
185b4670fc7SIvan Donchevskii }
186b4670fc7SIvan Donchevskii
test3(const Proxy2 & p)187b4670fc7SIvan Donchevskii void test3(const Proxy2 &p) {
188b4670fc7SIvan Donchevskii p.
189b4670fc7SIvan Donchevskii }
190b4670fc7SIvan Donchevskii
1915c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:184:6 %s -o - | FileCheck -check-prefix=CHECK-CC8 --implicit-check-not="Derived : Derived(" %s
1924a7cd637SEric Liu // CHECK-CC8: Base1 (InBase) : Base1::
1934a7cd637SEric Liu // CHECK-CC8: member1 (InBase) : [#int#][#Base1::#]member1
1944a7cd637SEric Liu // CHECK-CC8: member1 (InBase) : [#int#][#Base2::#]member1
1954a7cd637SEric Liu // CHECK-CC8: member2 (InBase) : [#float#][#Base1::#]member2
1964a7cd637SEric Liu // CHECK-CC8: member3 (InBase) : [#double#][#Base2::#]member3
197b4670fc7SIvan Donchevskii // CHECK-CC8: member4 : [#int#]member4
1985c55d374SSam McCall // CHECK-CC8: member5 : [#int#]member5 (requires fix-it: {184:4-184:6} to ".")
1994a7cd637SEric Liu // CHECK-CC8: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#float#>)
2004a7cd637SEric Liu // CHECK-CC8: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#double#>)[# const#]
2014a7cd637SEric Liu // CHECK-CC8: memfun1 (Hidden,InBase) : [#void#]Base2::memfun1(<#int#>)
2024a7cd637SEric Liu // CHECK-CC8: memfun2 (InBase) : [#void#][#Base3::#]memfun2(<#int#>)
203b4670fc7SIvan Donchevskii // CHECK-CC8: memfun3 : [#int#]memfun3(<#int#>)
2045c55d374SSam McCall // CHECK-CC8: operator-> : [#Derived *#]operator->()[# const#] (requires fix-it: {184:4-184:6} to ".")
205b4670fc7SIvan Donchevskii
2065c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:188:6 %s -o - | FileCheck -check-prefix=CHECK-CC9 --implicit-check-not="Derived : Derived(" %s
2074a7cd637SEric Liu // CHECK-CC9: Base1 (InBase) : Base1::
2085c55d374SSam McCall // CHECK-CC9: member1 (InBase) : [#int#][#Base1::#]member1 (requires fix-it: {188:4-188:5} to "->")
2095c55d374SSam McCall // CHECK-CC9: member1 (InBase) : [#int#][#Base2::#]member1 (requires fix-it: {188:4-188:5} to "->")
2105c55d374SSam McCall // CHECK-CC9: member2 (InBase) : [#float#][#Base1::#]member2 (requires fix-it: {188:4-188:5} to "->")
2115c55d374SSam McCall // CHECK-CC9: member3 (InBase) : [#double#][#Base2::#]member3 (requires fix-it: {188:4-188:5} to "->")
2125c55d374SSam McCall // CHECK-CC9: member4 : [#int#]member4 (requires fix-it: {188:4-188:5} to "->")
213b4670fc7SIvan Donchevskii // CHECK-CC9: member5 : [#int#]member5
2145c55d374SSam McCall // CHECK-CC9: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#float#>) (requires fix-it: {188:4-188:5} to "->")
2155c55d374SSam McCall // CHECK-CC9: memfun1 (InBase) : [#void#][#Base3::#]memfun1(<#double#>)[# const#] (requires fix-it: {188:4-188:5} to "->")
2165c55d374SSam McCall // CHECK-CC9: memfun1 (Hidden,InBase) : [#void#]Base2::memfun1(<#int#>) (requires fix-it: {188:4-188:5} to "->")
2175c55d374SSam McCall // CHECK-CC9: memfun2 (InBase) : [#void#][#Base3::#]memfun2(<#int#>) (requires fix-it: {188:4-188:5} to "->")
2185c55d374SSam McCall // CHECK-CC9: memfun3 : [#int#]memfun3(<#int#>) (requires fix-it: {188:4-188:5} to "->")
219b4670fc7SIvan Donchevskii // CHECK-CC9: operator-> : [#Derived *#]operator->()[# const#]
2203dea5272SSam McCall
2213dea5272SSam McCall // These overload sets differ only by return type and this-qualifiers.
2223dea5272SSam McCall // So for any given callsite, only one is available.
2233dea5272SSam McCall struct Overloads {
2243dea5272SSam McCall double ConstOverload(char);
2253dea5272SSam McCall int ConstOverload(char) const;
2263dea5272SSam McCall
2273dea5272SSam McCall int RefOverload(char) &;
2283dea5272SSam McCall double RefOverload(char) const&;
2293dea5272SSam McCall char RefOverload(char) &&;
2303dea5272SSam McCall };
testLValue(Overloads & Ref)2313dea5272SSam McCall void testLValue(Overloads& Ref) {
2323dea5272SSam McCall Ref.
2333dea5272SSam McCall }
testConstLValue(const Overloads & ConstRef)2343dea5272SSam McCall void testConstLValue(const Overloads& ConstRef) {
2353dea5272SSam McCall ConstRef.
2363dea5272SSam McCall }
testRValue()2373dea5272SSam McCall void testRValue() {
2383dea5272SSam McCall Overloads().
2393dea5272SSam McCall }
testXValue(Overloads & X)2403dea5272SSam McCall void testXValue(Overloads& X) {
2413dea5272SSam McCall static_cast<Overloads&&>(X).
2423dea5272SSam McCall }
2433dea5272SSam McCall
2445c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:232:7 %s -o - | FileCheck -check-prefix=CHECK-LVALUE %s \
2453dea5272SSam McCall // RUN: --implicit-check-not="[#int#]ConstOverload(" \
2463dea5272SSam McCall // RUN: --implicit-check-not="[#double#]RefOverload(" \
2473dea5272SSam McCall // RUN: --implicit-check-not="[#char#]RefOverload("
2483dea5272SSam McCall // CHECK-LVALUE-DAG: [#double#]ConstOverload(
2493dea5272SSam McCall // CHECK-LVALUE-DAG: [#int#]RefOverload(
2503dea5272SSam McCall
2515c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:235:12 %s -o - | FileCheck -check-prefix=CHECK-CONSTLVALUE %s \
2523dea5272SSam McCall // RUN: --implicit-check-not="[#double#]ConstOverload(" \
2533dea5272SSam McCall // RUN: --implicit-check-not="[#int#]RefOverload(" \
2543dea5272SSam McCall // RUN: --implicit-check-not="[#char#]RefOverload("
2553dea5272SSam McCall // CHECK-CONSTLVALUE: [#int#]ConstOverload(
2563dea5272SSam McCall // CHECK-CONSTLVALUE: [#double#]RefOverload(
2573dea5272SSam McCall
2585c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:238:15 %s -o - | FileCheck -check-prefix=CHECK-PRVALUE %s \
2593dea5272SSam McCall // RUN: --implicit-check-not="[#int#]ConstOverload(" \
2603dea5272SSam McCall // RUN: --implicit-check-not="[#int#]RefOverload(" \
2613dea5272SSam McCall // RUN: --implicit-check-not="[#double#]RefOverload("
2623dea5272SSam McCall // CHECK-PRVALUE: [#double#]ConstOverload(
2633dea5272SSam McCall // CHECK-PRVALUE: [#char#]RefOverload(
2643dea5272SSam McCall
2655c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:241:31 %s -o - | FileCheck -check-prefix=CHECK-XVALUE %s \
2663dea5272SSam McCall // RUN: --implicit-check-not="[#int#]ConstOverload(" \
2673dea5272SSam McCall // RUN: --implicit-check-not="[#int#]RefOverload(" \
2683dea5272SSam McCall // RUN: --implicit-check-not="[#double#]RefOverload("
2693dea5272SSam McCall // CHECK-XVALUE: [#double#]ConstOverload(
2703dea5272SSam McCall // CHECK-XVALUE: [#char#]RefOverload(
2713dea5272SSam McCall
testOverloadOperator()2723dea5272SSam McCall void testOverloadOperator() {
2733dea5272SSam McCall struct S {
2743dea5272SSam McCall char operator=(int) const;
2753dea5272SSam McCall int operator=(int);
2763dea5272SSam McCall } s;
2773dea5272SSam McCall return s.
2783dea5272SSam McCall }
2795c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:277:12 %s -o - | FileCheck -check-prefix=CHECK-OPER %s \
2803dea5272SSam McCall // RUN: --implicit-check-not="[#char#]operator=("
2813dea5272SSam McCall // CHECK-OPER: [#int#]operator=(
2823dea5272SSam McCall
2838222107aSHaojian Wu struct S { int member; };
2848222107aSHaojian Wu S overloaded(int);
2858222107aSHaojian Wu S overloaded(double);
foo()2868222107aSHaojian Wu void foo() {
2878222107aSHaojian Wu // No overload matches, but we have recovery-expr with the correct type.
2888222107aSHaojian Wu overloaded().
2898222107aSHaojian Wu }
2905c55d374SSam McCall // RUN: not %clang_cc1 -fsyntax-only -frecovery-ast -frecovery-ast-type -code-completion-at=%s:288:16 %s -o - | FileCheck -check-prefix=CHECK-RECOVERY %s
2918222107aSHaojian Wu // CHECK-RECOVERY: [#int#]member
2925c55d374SSam McCall template <typename T>
fooDependent(T t)2935c55d374SSam McCall void fooDependent(T t) {
2945c55d374SSam McCall // Overload not resolved, but we notice all candidates return the same type.
2955c55d374SSam McCall overloaded(t).
2965c55d374SSam McCall }
2975c55d374SSam McCall // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:295:17 %s -o - | FileCheck -check-prefix=CHECK-OVERLOAD %s
2985c55d374SSam McCall // CHECK-OVERLOAD: [#int#]member
299*612f5ed8SKadir Cetinkaya
300*612f5ed8SKadir Cetinkaya struct Base4 {
301*612f5ed8SKadir Cetinkaya Base4 base4();
302*612f5ed8SKadir Cetinkaya };
303*612f5ed8SKadir Cetinkaya
304*612f5ed8SKadir Cetinkaya template <typename T>
305*612f5ed8SKadir Cetinkaya struct Derived2 : Base4 {};
306*612f5ed8SKadir Cetinkaya
307*612f5ed8SKadir Cetinkaya template <typename T>
testMembersFromBasesInDependentContext()308*612f5ed8SKadir Cetinkaya void testMembersFromBasesInDependentContext() {
309*612f5ed8SKadir Cetinkaya Derived2<T> X;
310*612f5ed8SKadir Cetinkaya (void)X.base4().base4();
311*612f5ed8SKadir Cetinkaya // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:310:19 %s -o - | FileCheck -check-prefix=CHECK-MEMBERS-FROM-BASE-DEPENDENT %s
312*612f5ed8SKadir Cetinkaya // CHECK-MEMBERS-FROM-BASE-DEPENDENT: [#Base4#]base4
313*612f5ed8SKadir Cetinkaya }
314