Add the global namespace (the "::" namespace specifier) to the list of

namespaces to try for potential typo corrections.

llvm-svn: 184762
This commit is contained in:
Kaelyn Uhrain 2013-06-24 17:49:03 +00:00
parent b761900a12
commit 52dd02d8ef
4 changed files with 18 additions and 7 deletions

View File

@ -3414,7 +3414,7 @@ class NamespaceSpecifierSet {
NamespaceSpecifierSet(ASTContext &Context, DeclContext *CurContext,
CXXScopeSpec *CurScopeSpec)
: Context(Context), CurContextChain(BuildContextChain(CurContext)),
isSorted(true) {
isSorted(false) {
if (CurScopeSpec && CurScopeSpec->getScopeRep())
getNestedNameSpecifierIdentifiers(CurScopeSpec->getScopeRep(),
CurNameSpecifierIdentifiers);
@ -3427,6 +3427,12 @@ class NamespaceSpecifierSet {
if (NamespaceDecl *ND = dyn_cast_or_null<NamespaceDecl>(*C))
CurContextIdentifiers.push_back(ND->getIdentifier());
}
// Add the global context as a NestedNameSpecifier
Distances.insert(1);
DistanceMap[1].push_back(
SpecifierInfo(cast<DeclContext>(Context.getTranslationUnitDecl()),
NestedNameSpecifier::GlobalSpecifier(Context), 1));
}
/// \brief Add the namespace to the set, computing the corresponding

View File

@ -3,7 +3,7 @@
// Fun things you can do with inline namespaces:
inline namespace X {
void f1();
void f1(); // expected-note {{'::f1' declared here}}
inline namespace Y {
void f2();
@ -21,7 +21,7 @@ void foo1() {
f1();
::f1();
X::f1();
Y::f1(); // expected-error {{no member named 'f1' in namespace 'X::Y'}}
Y::f1(); // expected-error {{no member named 'f1' in namespace 'X::Y'; did you mean '::f1'?}}
f2();
::f2();

View File

@ -6,7 +6,7 @@
namespace std {
template<typename T> class basic_string { // expected-note 2{{'basic_string' declared here}} \
// expected-note {{'otherstd::basic_string' declared here}}
// expected-note {{'::basic_string' declared here}}
public:
int find(const char *substr); // expected-note{{'find' declared here}}
static const int npos = -1; // expected-note{{'npos' declared here}}
@ -84,8 +84,12 @@ namespace nonstd {
yarn str4; // expected-error{{unknown type name 'yarn'; did you mean 'nonstd::yarn'?}}
wibble::yarn str5; // expected-error{{no type named 'yarn' in namespace 'otherstd'; did you mean 'nonstd::yarn'?}}
namespace another {
template<typename T> class wide_string {}; // expected-note {{'another::wide_string' declared here}}
}
int poit() {
nonstd::basic_string<char> str; // expected-error{{no template named 'basic_string' in namespace 'nonstd'; did you mean 'otherstd::basic_string'?}}
nonstd::basic_string<char> str; // expected-error{{no template named 'basic_string' in namespace 'nonstd'; did you mean '::basic_string'?}}
nonstd::wide_string<char> str2; // expected-error{{no template named 'wide_string' in namespace 'nonstd'; did you mean 'another::wide_string'?}}
return wibble::narf; // expected-error{{no member named 'narf' in namespace 'otherstd'; did you mean 'nonstd::narf'?}}
}

View File

@ -8,7 +8,7 @@ namespace B {
using namespace A ;
}
namespace C {}
namespace C {} // expected-note{{namespace '::C' defined here}}
namespace D {
@ -22,7 +22,8 @@ namespace D {
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::C ; // expected-error{{expected namespace name}}
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 '::C'?}}
}
using namespace ! ; // expected-error{{expected namespace name}}