diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-02-07 03:30:24 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-02-07 03:30:24 +0000 |
commit | 3646c68676c3c46a026b23d52188ef6e0d856178 (patch) | |
tree | e95e24d1132aca61782501a9c433cfbce948dc43 /lib | |
parent | 878d0ad2c9d83ee6485fd16e21c5082acc63a890 (diff) | |
download | clang-3646c68676c3c46a026b23d52188ef6e0d856178.tar.gz |
Simplify FindExternalVisibleDeclsByName by making it return a bool indicating
if it found any decls, rather than returning a list of found decls. This
removes a returning-ArrayRef-to-deleted-storage bug from
MultiplexExternalSemaSource (in code not exercised by any of the clang
binaries), reduces the work required in the found-no-decls case with PCH, and
importantly removes the need for DeclContext::lookup to be reentrant.
No functionality change intended!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174576 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/DeclBase.cpp | 10 | ||||
-rw-r--r-- | lib/AST/ExternalASTSource.cpp | 4 | ||||
-rw-r--r-- | lib/Frontend/ChainedIncludesSource.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/MultiplexExternalSemaSource.cpp | 17 | ||||
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 7 |
5 files changed, 20 insertions, 20 deletions
diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 27a91cb7e6..52ecdeb318 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -1186,7 +1186,15 @@ DeclContext::lookup(DeclarationName Name) { } ExternalASTSource *Source = getParentASTContext().getExternalSource(); - return Source->FindExternalVisibleDeclsByName(this, Name); + if (Source->FindExternalVisibleDeclsByName(this, Name)) { + if (StoredDeclsMap *Map = LookupPtr.getPointer()) { + StoredDeclsMap::iterator I = Map->find(Name); + if (I != Map->end()) + return I->second.getLookupResult(); + } + } + + return lookup_result(lookup_iterator(0), lookup_iterator(0)); } StoredDeclsMap *Map = LookupPtr.getPointer(); diff --git a/lib/AST/ExternalASTSource.cpp b/lib/AST/ExternalASTSource.cpp index 6b9fe26ccc..96ebe92ce3 100644 --- a/lib/AST/ExternalASTSource.cpp +++ b/lib/AST/ExternalASTSource.cpp @@ -43,10 +43,10 @@ ExternalASTSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) { return 0; } -DeclContextLookupResult +bool ExternalASTSource::FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { - return DeclContext::lookup_result(); + return false; } void ExternalASTSource::completeVisibleDeclsMap(const DeclContext *DC) { diff --git a/lib/Frontend/ChainedIncludesSource.cpp b/lib/Frontend/ChainedIncludesSource.cpp index 16eb8890d9..f414f93812 100644 --- a/lib/Frontend/ChainedIncludesSource.cpp +++ b/lib/Frontend/ChainedIncludesSource.cpp @@ -191,7 +191,7 @@ CXXBaseSpecifier * ChainedIncludesSource::GetExternalCXXBaseSpecifiers(uint64_t Offset) { return getFinalReader().GetExternalCXXBaseSpecifiers(Offset); } -DeclContextLookupResult +bool ChainedIncludesSource::FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { return getFinalReader().FindExternalVisibleDeclsByName(DC, Name); diff --git a/lib/Sema/MultiplexExternalSemaSource.cpp b/lib/Sema/MultiplexExternalSemaSource.cpp index ecce6d8e7b..d85624ba6f 100644 --- a/lib/Sema/MultiplexExternalSemaSource.cpp +++ b/lib/Sema/MultiplexExternalSemaSource.cpp @@ -81,19 +81,12 @@ CXXBaseSpecifier *MultiplexExternalSemaSource::GetExternalCXXBaseSpecifiers( return 0; } -DeclContextLookupResult MultiplexExternalSemaSource:: +bool MultiplexExternalSemaSource:: FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { - StoredDeclsList DeclsFound; - for(size_t i = 0; i < Sources.size(); ++i) { - DeclContext::lookup_result R = - Sources[i]->FindExternalVisibleDeclsByName(DC, Name); - for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E; - ++I) { - if (!DeclsFound.HandleRedeclaration(*I)) - DeclsFound.AddSubsequentDecl(*I); - } - } - return DeclsFound.getLookupResult(); + bool AnyDeclsFound = false; + for (size_t i = 0; i < Sources.size(); ++i) + AnyDeclsFound |= Sources[i]->FindExternalVisibleDeclsByName(DC, Name); + return AnyDeclsFound; } void MultiplexExternalSemaSource::completeVisibleDeclsMap(const DeclContext *DC){ diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index aa4c448e98..1213084e36 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -5424,14 +5424,13 @@ static ModuleFile *getDefinitiveModuleFileFor(const DeclContext *DC, return 0; } -DeclContext::lookup_result +bool ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, DeclarationName Name) { assert(DC->hasExternalVisibleStorage() && "DeclContext has no visible decls in storage"); if (!Name) - return DeclContext::lookup_result(DeclContext::lookup_iterator(0), - DeclContext::lookup_iterator(0)); + return false; SmallVector<NamedDecl *, 64> Decls; @@ -5464,7 +5463,7 @@ ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, } ++NumVisibleDeclContextsRead; SetExternalVisibleDeclsForName(DC, Name, Decls); - return const_cast<DeclContext*>(DC)->lookup(Name); + return !Decls.empty(); } namespace { |