13003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify %s 26180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 36180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith// We have to avoid ADL for this test. 46180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 56180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithtemplate <unsigned N> class test {}; 66180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 76180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithclass foo {}; // expected-note {{candidate}} 86180245e9f63d2927b185ec251fb75aba30f1cacRichard Smithtest<0> foo(foo); // expected-note {{candidate}} 9840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smith 10840462670ba7a6bc26265a2306b35f2f0f01f51cRichard Smithnamespace Test0 { 116180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith class foo { int x; }; 126180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith test<1> foo(class foo); 136180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 146180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith namespace A { 156180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith test<2> foo(class ::foo); // expected-note {{candidate}} \ 166180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // expected-note{{passing argument to parameter here}} 176180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 186180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith void test0() { 196180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith using ::foo; 206180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 216180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith class foo a; 226180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith test<0> _ = (foo)(a); 236180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } 246180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 256180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith void test1() { 266180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith using Test0::foo; 276180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 286180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith class foo a; 296180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith test<1> _ = (foo)(a); 305121781d756e7814168b4255a57545d5ca497ec3Aaron Ballman }; 316180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 326180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith void test2() { 336180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith class ::foo a; 346180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 356180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith // Argument-dependent lookup is ambiguous between B:: and ::. 366180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith test<0> _0 = foo(a); // expected-error {{call to 'foo' is ambiguous}} 376180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 38e653ba2f3b6d993b5d410554c12416c03ec7775bRichard Smith // But basic unqualified lookup is not. 395121781d756e7814168b4255a57545d5ca497ec3Aaron Ballman test<2> _1 = (foo)(a); 406180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 416180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith class Test0::foo b; 426180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith test<2> _2 = (foo)(b); // expected-error {{no viable conversion from 'class Test0::foo' to 'class ::foo'}} 436180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } 446180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } 456180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith} 466180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 475121781d756e7814168b4255a57545d5ca497ec3Aaron Ballmannamespace Test1 { 486180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith namespace A { 496180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith class a {}; 506180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } 516180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 526180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith namespace B { 536180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith typedef class {} b; 546180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith } 556180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith 566180245e9f63d2927b185ec251fb75aba30f1cacRichard Smith namespace C { 573003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith int c(); // expected-note {{target of using declaration}} 583003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith } 593003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith 603003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith namespace D { 613003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith using typename A::a; 623003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith using typename B::b; 633003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith using typename C::c; // expected-error {{'typename' keyword used on a non-type}} 643003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith 653003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith a _1 = A::a(); 663003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith b _2 = B::b(); 673003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith } 683003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith} 693003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith 703003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smithnamespace test2 { 713003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith class A { 723003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith protected: 733003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith operator int(); 743003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith operator bool(); 753003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith }; 763003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith 773003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith class B : private A { 783003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith protected: 793003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith using A::operator int; // expected-note {{declared protected here}} 803003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith public: 813003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith using A::operator bool; 823003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith }; 833003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith 843003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith int test() { 853003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith bool b = B(); 863003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith return B(); // expected-error {{'operator int' is a protected member of 'test2::B'}} 873003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith } 883003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith} 893003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith 903003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smithnamespace test3 { 913003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith class A { 923003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith public: 933003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith ~A(); 943003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith }; 953003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith 963003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith class B { 973003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith friend class C; 983003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith private: 993003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith operator A*(); 1003003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith }; 1013003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith 1023003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith class C : public B { 1033003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith public: 1043003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith using B::operator A*; 1053003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith }; 1063003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith 1073003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith void test() { 1083003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith delete C(); 1093003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith } 1103003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith} 1113003e1d6626d07e8fc4af95fad95b3a5d4c4af98Richard Smith