// 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();
}
}