blob: 935f5767889fb5b0b8d884ad37ac160513401ba6 [file] [log] [blame]
// 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}}
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();
}
}