diff options
-rw-r--r-- | lib/Sema/SemaLookup.cpp | 40 | ||||
-rw-r--r-- | test/Sema/function.c | 3 |
2 files changed, 33 insertions, 10 deletions
diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index c69022d935..15c3e836a2 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -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); diff --git a/test/Sema/function.c b/test/Sema/function.c index 1eb5ac4623..1b0dc2adeb 100644 --- a/test/Sema/function.c +++ b/test/Sema/function.c @@ -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]); |