]> granicus.if.org Git - clang/commitdiff
Make sure to consider non-DeclContext scopes properly when finding
authorDouglas Gregor <dgregor@apple.com>
Fri, 13 Jan 2012 23:06:53 +0000 (23:06 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 13 Jan 2012 23:06:53 +0000 (23:06 +0000)
multiple name lookup results in C/Objective-C. Fixes a regression a
caused in r147533, found by Enea Zaffanella!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148154 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaLookup.cpp
test/Sema/function.c

index c69022d935c644e419280c238cde701d30cccc05..15c3e836a2c364ad3260e350753900a3b50011ae 100644 (file)
@@ -1163,20 +1163,40 @@ bool Sema::LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation) {
         // Check whether there are any other declarations with the same name
         // and in the same scope.
         if (I != IEnd) {
-          DeclContext *DC = (*I)->getDeclContext()->getRedeclContext();
+          // Find the scope in which this declaration was declared (if it
+          // actually exists in a Scope).
+          while (S && !S->isDeclScope(D))
+            S = S->getParent();
+          
+          // If the scope containing the declaration is the translation unit,
+          // then we'll need to perform our checks based on the matching
+          // DeclContexts rather than matching scopes.
+          if (S && isNamespaceOrTranslationUnitScope(S))
+            S = 0;
+
+          // Compute the DeclContext, if we need it.
+          DeclContext *DC = 0;
+          if (!S)
+            DC = (*I)->getDeclContext()->getRedeclContext();
+            
           IdentifierResolver::iterator LastI = I;
           for (++LastI; LastI != IEnd; ++LastI) {
-            DeclContext *LastDC 
-              = (*LastI)->getDeclContext()->getRedeclContext();
+            if (S) {
+              // Match based on scope.
+              if (!S->isDeclScope(*LastI))
+                break;
+            } else {
+              // Match based on DeclContext.
+              DeclContext *LastDC 
+                = (*LastI)->getDeclContext()->getRedeclContext();
+              if (!LastDC->Equals(DC))
+                break;
+            }
+            
+            // If the declaration isn't in the right namespace, skip it.
             if (!(*LastI)->isInIdentifierNamespace(IDNS))
               continue;
-            
-            if (!LastDC->Equals(DC))
-              break;
-            
-            if (!LastDC->isFileContext() && !S->isDeclScope(*LastI))
-              break;
-            
+                        
             D = R.isHiddenDeclarationVisible()? *LastI : getVisibleDecl(*LastI);
             if (D)
               R.addDecl(D);
index 1eb5ac4623dfa23a7f23abbefc51f22631b6aba7..1b0dc2adeb714f32fab0ba9bdaaf7faab5309bd5 100644 (file)
@@ -89,3 +89,6 @@ unknown_type t19(int* P) {   // expected-error {{unknown type name 'unknown_type
 
 // missing ',' before '...'
 void t20(int i...) { } // expected-error {{requires a comma}}
+
+int n;
+void t21(int n, int (*array)[n]);