From: Douglas Gregor Date: Thu, 7 Jan 2010 00:31:29 +0000 (+0000) Subject: Fix the search for visible declarations within a Scope to ensure that X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=539c5c34063066753f27bb0f39fdcde1acc06328;p=clang Fix the search for visible declarations within a Scope to ensure that we look into a Scope that corresponds to a compound statement whose scope was combined with the scope of the function that owns it. This improves typo correction in many common cases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92879 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 9ed15225b4..897ce20075 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -2000,6 +2000,19 @@ static void LookupVisibleDecls(Scope *S, LookupResult &Result, if (!S) return; + if (!S->getEntity() || !S->getParent() || + ((DeclContext *)S->getEntity())->isFunctionOrMethod()) { + // Walk through the declarations in this Scope. + for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); + D != DEnd; ++D) { + if (NamedDecl *ND = dyn_cast((Decl *)((*D).get()))) + if (Result.isAcceptableDecl(ND)) { + Consumer.FoundDecl(ND, Visited.checkHidden(ND)); + Visited.add(ND); + } + } + } + DeclContext *Entity = 0; if (S->getEntity()) { // Look into this scope's declaration context, along with any of its @@ -2041,22 +2054,11 @@ static void LookupVisibleDecls(Scope *S, LookupResult &Result, // doing so would force the normal C++ name-lookup code to look into the // translation unit decl when the IdentifierInfo chains would suffice. // Once we fix that problem (which is part of a more general "don't look - // in DeclContexts unless we have to" optimization), we can eliminate the - // TranslationUnit parameter entirely. + // in DeclContexts unless we have to" optimization), we can eliminate this. Entity = Result.getSema().Context.getTranslationUnitDecl(); LookupVisibleDecls(Entity, Result, /*QualifiedNameLookup=*/false, Consumer, Visited); - } else { - // Walk through the declarations in this Scope. - for (Scope::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); - D != DEnd; ++D) { - if (NamedDecl *ND = dyn_cast((Decl *)((*D).get()))) - if (Result.isAcceptableDecl(ND)) { - Consumer.FoundDecl(ND, Visited.checkHidden(ND)); - Visited.add(ND); - } - } - } + } if (Entity) { // Lookup visible declarations in any namespaces found by using diff --git a/test/FixIt/typo.cpp b/test/FixIt/typo.cpp index 50c6d312b8..c0570258c5 100644 --- a/test/FixIt/typo.cpp +++ b/test/FixIt/typo.cpp @@ -21,8 +21,9 @@ tring str2; // expected-error{{unknown type name 'tring'; did you mean 'string'? ::other_std::string str3; // expected-error{{no member named 'other_std' in the global namespace; did you mean 'otherstd'?}} -float area(float radius, float pi) { - return radious * pi; // expected-error{{use of undeclared identifier 'radious'; did you mean 'radius'?}} +float area(float radius, // expected-note{{'radius' declared here}} + float pi) { + return radious * pi; // expected-error{{did you mean 'radius'?}} } bool test_string(std::string s) { diff --git a/test/Sema/switch.c b/test/Sema/switch.c index f815ba4627..08ab0e0ebd 100644 --- a/test/Sema/switch.c +++ b/test/Sema/switch.c @@ -76,7 +76,7 @@ void test6() { } // PR5606 -int f0(int var) { +int f0(int var) { // expected-note{{'var' declared here}} switch (va) { // expected-error{{use of undeclared identifier 'va'}} case 1: break;