From 8d90b4ab994c48c4b6d53122282dc93ac722bfc7 Mon Sep 17 00:00:00 2001 From: Kaelyn Uhrain Date: Mon, 24 Jun 2013 17:49:03 +0000 Subject: [PATCH] Add the global namespace (the "::" namespace specifier) to the list of namespaces to try for potential typo corrections. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184762 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaLookup.cpp | 8 +++++++- test/CXX/dcl.dcl/basic.namespace/namespace.def/p8.cpp | 4 ++-- test/FixIt/typo.cpp | 8 ++++++-- test/Parser/cxx-using-directive.cpp | 5 +++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 6ae040ffd7..dbf66711af 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -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(*C)) CurContextIdentifiers.push_back(ND->getIdentifier()); } + + // Add the global context as a NestedNameSpecifier + Distances.insert(1); + DistanceMap[1].push_back( + SpecifierInfo(cast(Context.getTranslationUnitDecl()), + NestedNameSpecifier::GlobalSpecifier(Context), 1)); } /// \brief Add the namespace to the set, computing the corresponding diff --git a/test/CXX/dcl.dcl/basic.namespace/namespace.def/p8.cpp b/test/CXX/dcl.dcl/basic.namespace/namespace.def/p8.cpp index 3bc485601c..816cdb08a9 100644 --- a/test/CXX/dcl.dcl/basic.namespace/namespace.def/p8.cpp +++ b/test/CXX/dcl.dcl/basic.namespace/namespace.def/p8.cpp @@ -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(); diff --git a/test/FixIt/typo.cpp b/test/FixIt/typo.cpp index b3568a5bbf..ea4a97133c 100644 --- a/test/FixIt/typo.cpp +++ b/test/FixIt/typo.cpp @@ -6,7 +6,7 @@ namespace std { template 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 class wide_string {}; // expected-note {{'another::wide_string' declared here}} +} int poit() { - nonstd::basic_string str; // expected-error{{no template named 'basic_string' in namespace 'nonstd'; did you mean 'otherstd::basic_string'?}} + nonstd::basic_string str; // expected-error{{no template named 'basic_string' in namespace 'nonstd'; did you mean '::basic_string'?}} + nonstd::wide_string 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'?}} } diff --git a/test/Parser/cxx-using-directive.cpp b/test/Parser/cxx-using-directive.cpp index 9a1a6de892..1b8f495b70 100644 --- a/test/Parser/cxx-using-directive.cpp +++ b/test/Parser/cxx-using-directive.cpp @@ -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}} -- 2.40.0