The removal is tried by retrying the failed lookup of a correction candidate with either the MemberContext or SS (CXXScopeSpecifier) or both set to NULL if they weren't already. If the candidate identifier is then looked up successfully, make a note in the candidate that the SourceRange should include any existing nested name specifier even if the candidate isn't adding a different one (i.e. the candidate has a NULL NestedNameSpecifier). Also tweak the diagnostic messages to differentiate between a suggestion that just replaces the identifer but leaves the existing nested name specifier intact and one that replaces the entire qualified identifier, in cases where the suggested replacement is unqualified. llvm-svn: 185487
41 lines
1.1 KiB
C++
41 lines
1.1 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
|
|
class A {};
|
|
|
|
namespace B {
|
|
namespace A {} // expected-note{{namespace '::B::A' defined here}} \
|
|
// expected-note{{namespace 'B::A' defined here}}
|
|
using namespace A ;
|
|
}
|
|
|
|
namespace C {} // expected-note{{namespace 'C' defined here}}
|
|
|
|
namespace D {
|
|
|
|
class C {
|
|
|
|
using namespace B ; // expected-error{{not allowed}}
|
|
};
|
|
|
|
namespace B {}
|
|
|
|
using namespace C ;
|
|
using namespace B::A ; // expected-error{{no namespace named 'A' in namespace 'D::B'; did you mean '::B::A'?}}
|
|
using namespace ::B::A ;
|
|
using namespace ::D::F ; // expected-error{{expected namespace name}}
|
|
using namespace ::D::C ; // expected-error{{no namespace named 'C' in namespace 'D'; did you mean simply 'C'?}}
|
|
}
|
|
|
|
using namespace ! ; // expected-error{{expected namespace name}}
|
|
using namespace A ; // expected-error{{no namespace named 'A'; did you mean 'B::A'?}}
|
|
using namespace ::A // expected-error{{expected namespace name}} \
|
|
// expected-error{{expected ';' after namespace name}}
|
|
B ;
|
|
|
|
void test_nslookup() {
|
|
int B;
|
|
class C;
|
|
using namespace B;
|
|
using namespace C;
|
|
}
|