]> granicus.if.org Git - clang/commitdiff
Fix the search for visible declarations within a Scope to ensure that
authorDouglas Gregor <dgregor@apple.com>
Thu, 7 Jan 2010 00:31:29 +0000 (00:31 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 7 Jan 2010 00:31:29 +0000 (00:31 +0000)
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

lib/Sema/SemaLookup.cpp
test/FixIt/typo.cpp
test/Sema/switch.c

index 9ed15225b49acb82e38e5c7b2090a3a5c38a533c..897ce200758111a7dfb59d2667227e0c988444e5 100644 (file)
@@ -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<NamedDecl>((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<NamedDecl>((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
index 50c6d312b8c2425afeb00920e646f6fd8427658a..c0570258c53b5b75951729e71ab47f794fb68d22 100644 (file)
@@ -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) {
index f815ba4627f9c659ee8aac91e365429d44a63e73..08ab0e0ebd7355ccfa62359dfed6b037a583fb29 100644 (file)
@@ -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;