// RUN: %clang_cc1 -fsyntax-only -verify %s // We have to avoid ADL for this test. template <unsigned N> class test {}; class foo {}; // expected-note {{candidate}} test<0> foo(foo); // expected-note {{candidate}} namespace Test0 { class foo { int x; }; test<1> foo(class foo); namespace A { test<2> foo(class ::foo); // expected-note {{candidate}} \ // expected-note{{passing argument to parameter here}} void test0() { using ::foo; class foo a; test<0> _ = (foo)(a); } void test1() { using Test0::foo; class foo a; test<1> _ = (foo)(a); }; void test2() { class ::foo a; // Argument-dependent lookup is ambiguous between B:: and ::. test<0> _0 = foo(a); // expected-error {{call to 'foo' is ambiguous}} // But basic unqualified lookup is not. test<2> _1 = (foo)(a); class Test0::foo b; test<2> _2 = (foo)(b); // expected-error {{no viable conversion from 'class Test0::foo' to 'class ::foo' is possible}} } } } namespace Test1 { namespace A { class a {}; } namespace B { typedef class {} b; } namespace C { int c(); // expected-note {{target of using declaration}} } namespace D { using typename A::a; using typename B::b; using typename C::c; // expected-error {{'typename' keyword used on a non-type}} a _1 = A::a(); b _2 = B::b(); } } namespace test2 { class A { protected: operator int(); operator bool(); }; class B : private A { protected: using A::operator int; // expected-note {{'declared protected here'}} public: using A::operator bool; }; int test() { bool b = B(); return B(); // expected-error {{'operator int' is a protected member of 'test2::B'}} } } namespace test3 { class A { public: ~A(); }; class B { friend class C; private: operator A*(); }; class C : public B { public: using B::operator A*; }; void test() { delete C(); } }