diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-04-11 01:03:38 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-04-11 01:03:38 +0000 |
| commit | 83e78f5c3c3dbf8a29d615ceb84a70163a38f42e (patch) | |
| tree | 76501ef34779c54b08f425651b76d1594f615c76 /clang/lib/Sema | |
| parent | 917f97f1a350fcc2d754b5280d154c0fd8a38360 (diff) | |
| download | bcm5719-llvm-83e78f5c3c3dbf8a29d615ceb84a70163a38f42e.tar.gz bcm5719-llvm-83e78f5c3c3dbf8a29d615ceb84a70163a38f42e.zip | |
Fix handling of redeclaration lookup for using declarations, where the prior
declaration is not visible. Previously we didn't find hidden friend names in
this redeclaration lookup, because we forgot to treat it as a redeclaration
lookup. Conversely, we did find some local extern names, but those don't
actually conflict with a namespace-scope using declaration, because the only
conflicts we can get are scope conflicts, not conflicts due to the entities
being members of the same namespace.
llvm-svn: 206011
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 9 |
2 files changed, 13 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 850db26e9af..fbc3fd7eb81 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -7379,6 +7379,13 @@ NamedDecl *Sema::BuildUsingDeclaration(Scope *S, AccessSpecifier AS, NamedDecl *D = F.next(); if (!isDeclInScope(D, CurContext, S)) F.erase(); + // If we found a local extern declaration that's not ordinarily visible, + // and this declaration is being added to a non-block scope, ignore it. + // We're only checking for scope conflicts here, not also for violations + // of the linkage rules. + else if (!CurContext->isFunctionOrMethod() && D->isLocalExternDecl() && + !(D->getIdentifierNamespace() & Decl::IDNS_Ordinary)) + F.erase(); } F.done(); } else { diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index 39a1ceaa57e..172a07906da 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -244,10 +244,11 @@ static inline unsigned getIDNS(Sema::LookupNameKind NameKind, IDNS = Decl::IDNS_Tag; } break; + case Sema::LookupLabel: IDNS = Decl::IDNS_Label; break; - + case Sema::LookupMemberName: IDNS = Decl::IDNS_Member; if (CPlusPlus) @@ -263,8 +264,10 @@ static inline unsigned getIDNS(Sema::LookupNameKind NameKind, break; case Sema::LookupUsingDeclName: - IDNS = Decl::IDNS_Ordinary | Decl::IDNS_Tag - | Decl::IDNS_Member | Decl::IDNS_Using; + assert(Redeclaration && "should only be used for redecl lookup"); + IDNS = Decl::IDNS_Ordinary | Decl::IDNS_Tag | Decl::IDNS_Member | + Decl::IDNS_Using | Decl::IDNS_TagFriend | Decl::IDNS_OrdinaryFriend | + Decl::IDNS_LocalExtern; break; case Sema::LookupObjCProtocolName: |

