blob: 20a19ab042500633f7063862b43d7f970fa48775 [file] [log] [blame]
// RUN: %clang_cc1 -fsyntax-only -verify %s
// (this actually occurs before paragraph 1)
namespace test0 {
namespace A {}
class B {
using namespace A; // expected-error {{'using namespace' is not allowed in classes}}
};
}
struct opaque0 {};
struct opaque1 {};
// Test that names appear as if in deepest common ancestor.
namespace test1 {
namespace A {
namespace B {
opaque0 foo(); // expected-note {{candidate}}
}
}
namespace C {
opaque1 foo(); // expected-note {{candidate}}
opaque1 test() {
using namespace A::B;
return foo(); // C::foo
}
}
opaque1 test() {
using namespace A::B;
using namespace C;
return foo(); // expected-error {{call to 'foo' is ambiguous}}
}
}
// Same thing, but with the directives in namespaces.
namespace test2 {
namespace A {
namespace B {
opaque0 foo(); // expected-note {{candidate}}
}
}
namespace C {
opaque1 foo(); // expected-note {{candidate}}
namespace test {
using namespace A::B;
opaque1 test() {
return foo(); // C::foo
}
}
}
namespace test {
using namespace A::B;
using namespace C;
opaque1 test() {
return foo(); // expected-error {{call to 'foo' is ambiguous}}
}
}
}
// Transitivity.
namespace test3 {
namespace A {
namespace B {
opaque0 foo();
}
}
namespace C {
using namespace A;
}
opaque0 test0() {
using namespace C;
using namespace B;
return foo();
}
namespace D {
using namespace C;
}
namespace A {
opaque1 foo();
}
opaque1 test1() {
using namespace D;
return foo();
}
}
// Transitivity acts like synthetic using directives.
namespace test4 {
namespace A {
namespace B {
opaque0 foo(); // expected-note {{candidate}}
}
}
namespace C {
using namespace A::B;
}
opaque1 foo(); // expected-note {{candidate}}
namespace A {
namespace D {
using namespace C;
}
opaque0 test() {
using namespace D;
return foo();
}
}
opaque0 test() {
using namespace A::D;
return foo(); // expected-error {{call to 'foo' is ambiguous}}
}
}
// Bug: using directives should be followed when parsing default
// arguments in scoped declarations.
class test5 {
int inc(int x);
};
namespace Test5 {
int default_x = 0;
}
using namespace Test5;
int test5::inc(int x = default_x) {
return x+1;
}