blob: 12324740549fd2fa6cfa1f6c970cafe6293dd9ca [file] [log] [blame]
// RUN: %clang_cc1 -fsyntax-only -verify %s
namespace A {
class X { }; // expected-note{{candidate found by name lookup is 'A::X'}}
// expected-note@-1{{candidate found by name lookup is 'A::X'}}
}
namespace B {
void X(int); // expected-note{{candidate found by name lookup is 'B::X'}}
// expected-note@-1{{candidate found by name lookup is 'B::X'}}
}
// Using directive doesn't cause A::X to be hidden, so X is ambiguous.
namespace Test1a {
using namespace A;
using namespace B;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
namespace Test1b {
using namespace B;
using namespace A;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
// The behaviour here should be the same as using namespaces A and B directly
namespace Test2a {
namespace C {
using A::X; // expected-note{{candidate found by name lookup is 'Test2a::C::X'}}
}
namespace D {
using B::X; // expected-note{{candidate found by name lookup is 'Test2a::D::X'}}
}
using namespace C;
using namespace D;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
namespace Test2b {
namespace C {
using A::X; // expected-note{{candidate found by name lookup is 'Test2b::C::X'}}
}
namespace D {
using B::X; // expected-note{{candidate found by name lookup is 'Test2b::D::X'}}
}
using namespace D;
using namespace C;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
// Defining a function X inside C should hide using A::X in C but not D, so the result is ambiguous.
namespace Test3a {
namespace C {
using A::X;
void X(int); // expected-note{{candidate found by name lookup is 'Test3a::C::X'}}
}
namespace D {
using A::X; // expected-note{{candidate found by name lookup is 'Test3a::D::X'}}
}
using namespace C;
using namespace D;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
namespace Test3b {
namespace C {
using A::X;
void X(int); // expected-note{{candidate found by name lookup is 'Test3b::C::X'}}
}
namespace D {
using A::X; // expected-note{{candidate found by name lookup is 'Test3b::D::X'}}
}
using namespace D;
using namespace C;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
namespace Test3c {
namespace C {
void X(int); // expected-note{{candidate found by name lookup is 'Test3c::C::X'}}
using A::X;
}
namespace D {
using A::X; // expected-note{{candidate found by name lookup is 'Test3c::D::X'}}
}
using namespace C;
using namespace D;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
namespace Test3d {
namespace C {
void X(int); // expected-note{{candidate found by name lookup is 'Test3d::C::X'}}
using A::X;
}
namespace D {
using A::X; // expected-note{{candidate found by name lookup is 'Test3d::D::X'}}
}
using namespace D;
using namespace C;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
// A::X hidden in both C and D by overloaded function, so the result is not ambiguous.
namespace Test4a {
namespace C {
using A::X;
void X(int);
}
namespace D {
using A::X;
void X(int, int);
}
using namespace C;
using namespace D;
void f() {
X(1);
}
}
namespace Test4b {
namespace C {
using A::X;
void X(int);
}
namespace D {
using A::X;
void X(int, int);
}
using namespace D;
using namespace C;
void f() {
X(1);
}
}
namespace Test4c {
namespace C {
void X(int);
using A::X;
}
namespace D {
void X(int, int);
using A::X;
}
using namespace C;
using namespace D;
void f() {
X(1);
}
}
namespace Test4d {
namespace C {
void X(int);
using A::X;
}
namespace D {
void X(int, int);
using A::X;
}
using namespace D;
using namespace C;
void f() {
X(1);
}
}
// B::X hides class X in C, so the the result is not ambiguous
namespace Test5a {
namespace C {
using B::X;
class X { };
}
namespace D {
using B::X;
}
using namespace C;
using namespace D;
void f() {
X(1);
}
}
namespace Test5b {
namespace C {
using B::X;
class X { };
}
namespace D {
using B::X;
}
using namespace D;
using namespace C;
void f() {
X(1);
}
}
namespace Test5c {
namespace C {
class X { };
using B::X;
}
namespace D {
using B::X;
}
using namespace C;
using namespace D;
void f() {
X(1);
}
}
namespace Test5d {
namespace C {
class X { };
using B::X;
}
namespace D {
using B::X;
}
using namespace D;
using namespace C;
void f() {
X(1);
}
}
// B::X hides class X declared in both C and D, so the result is not ambiguous.
namespace Test6a {
namespace C {
class X { };
using B::X;
}
namespace D {
class X { };
using B::X;
}
using namespace C;
using namespace D;
void f() {
X(1);
}
}
namespace Test6b {
namespace C {
class X { };
using B::X;
}
namespace D {
class X { };
using B::X;
}
using namespace D;
using namespace C;
void f() {
X(1);
}
}
namespace Test6c {
namespace C {
using B::X;
class X { };
}
namespace D {
using B::X;
class X { };
}
using namespace C;
using namespace D;
void f() {
X(1);
}
}
namespace Test6d {
namespace C {
using B::X;
class X { };
}
namespace D {
using B::X;
class X { };
}
using namespace D;
using namespace C;
void f() {
X(1);
}
}
// function X inside C should hide class X in C but not D.
namespace Test7a {
namespace C {
class X;
void X(int); // expected-note{{candidate found by name lookup is 'Test7a::C::X'}}
}
namespace D {
class X; // expected-note{{candidate found by name lookup is 'Test7a::D::X'}}
}
using namespace C;
using namespace D;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
namespace Test7b {
namespace C {
class X;
void X(int); // expected-note{{candidate found by name lookup is 'Test7b::C::X'}}
}
namespace D {
class X; // expected-note{{candidate found by name lookup is 'Test7b::D::X'}}
}
using namespace D;
using namespace C;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
namespace Test7c {
namespace C {
void X(int); // expected-note{{candidate found by name lookup is 'Test7c::C::X'}}
class X;
}
namespace D {
class X; // expected-note{{candidate found by name lookup is 'Test7c::D::X'}}
}
using namespace C;
using namespace D;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}
namespace Test7d {
namespace C {
void X(int); // expected-note{{candidate found by name lookup is 'Test7d::C::X'}}
class X;
}
namespace D {
class X; // expected-note{{candidate found by name lookup is 'Test7d::D::X'}}
}
using namespace D;
using namespace C;
void f() {
X(1); // expected-error{{reference to 'X' is ambiguous}}
}
}