diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-10-30 01:02:04 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-10-30 01:02:04 +0000 |
commit | 3876cc88ac22b74ff0ae0a1f17eb08ba655eb93f (patch) | |
tree | 96489696d91b60c4a4f659c5101939af3559624a /clang/lib/Sema | |
parent | 60db142d8630dec57c32ffd11e0bdf4ccc6ff336 (diff) | |
download | bcm5719-llvm-3876cc88ac22b74ff0ae0a1f17eb08ba655eb93f.tar.gz bcm5719-llvm-3876cc88ac22b74ff0ae0a1f17eb08ba655eb93f.zip |
PR17731: When determining whether a tag and a non-tag were declared in the same
scope, be careful about function-scope declarations (which are not declared in
their semantic context).
llvm-svn: 193671
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index cca0f22f14a..dba0759b183 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -337,6 +337,21 @@ void LookupResult::deletePaths(CXXBasePaths *Paths) { delete Paths; } +/// Get a representative context for a declaration such that two declarations +/// will have the same context if they were found within the same scope. +DeclContext *getContextForScopeMatching(Decl *D) { + // For function-local declarations, use that function as the context. This + // doesn't account for scopes within the function; the caller must deal with + // those. + DeclContext *DC = D->getLexicalDeclContext(); + if (DC->isFunctionOrMethod()) + return DC; + + // Otherwise, look at the semantic context of the declaration. The + // declaration must have been found there. + return D->getDeclContext()->getRedeclContext(); +} + /// Resolves the result kind of this lookup. void LookupResult::resolveKind() { unsigned N = Decls.size(); @@ -437,8 +452,8 @@ void LookupResult::resolveKind() { // even if they're not visible. (ref?) if (HideTags && HasTag && !Ambiguous && (HasFunction || HasNonFunction || HasUnresolved)) { - if (Decls[UniqueTagIndex]->getDeclContext()->getRedeclContext()->Equals( - Decls[UniqueTagIndex? 0 : N-1]->getDeclContext()->getRedeclContext())) + if (getContextForScopeMatching(Decls[UniqueTagIndex])->Equals( + getContextForScopeMatching(Decls[UniqueTagIndex ? 0 : N - 1]))) Decls[UniqueTagIndex] = Decls[--N]; else Ambiguous = true; |