diff options
author | Anders Carlsson <andersca@mac.com> | 2009-06-26 06:29:23 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-06-26 06:29:23 +0000 |
commit | 6915bf6158865cf753ef5ea1997771ba4caa7480 (patch) | |
tree | 9326ad3502f0b769e7f3d4e2501fe38d7162cb6f | |
parent | 1eda63715f82a478d607e725a1a94a5cfe89913d (diff) | |
download | bcm5719-llvm-6915bf6158865cf753ef5ea1997771ba4caa7480.tar.gz bcm5719-llvm-6915bf6158865cf753ef5ea1997771ba4caa7480.zip |
Add NamedDecl::getUnderlyingDecl that can see through UsingDecl and ObjCCompatibleAliasDecl.
llvm-svn: 74279
-rw-r--r-- | clang/include/clang/AST/Decl.h | 7 | ||||
-rw-r--r-- | clang/lib/AST/Decl.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Sema/SemaLookup.cpp | 41 |
3 files changed, 32 insertions, 29 deletions
diff --git a/clang/include/clang/AST/Decl.h b/clang/include/clang/AST/Decl.h index ed2c790af68..3de01f3baeb 100644 --- a/clang/include/clang/AST/Decl.h +++ b/clang/include/clang/AST/Decl.h @@ -106,6 +106,13 @@ public: /// \brief Determine whether this declaration has linkage. bool hasLinkage() const; + /// \brief Looks through UsingDecls and ObjCCompatibleAliasDecls for + /// the underlying named decl. + NamedDecl *getUnderlyingDecl(); + const NamedDecl *getUnderlyingDecl() const { + return const_cast<NamedDecl*>(this)->getUnderlyingDecl(); + } + static bool classof(const Decl *D) { return D->getKind() >= NamedFirst && D->getKind() <= NamedLast; } diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 4fbf2f6f48e..5382ab52ab5 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -297,6 +297,19 @@ bool NamedDecl::hasLinkage() const { return false; } +NamedDecl *NamedDecl::getUnderlyingDecl() { + NamedDecl *ND = this; + while (true) { + if (UsingDecl *UD = dyn_cast<UsingDecl>(ND)) + ND = UD->getTargetDecl(); + else if (ObjCCompatibleAliasDecl *AD + = dyn_cast<ObjCCompatibleAliasDecl>(ND)) + return AD->getClassInterface(); + else + return ND; + } +} + //===----------------------------------------------------------------------===// // VarDecl Implementation //===----------------------------------------------------------------------===// diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index d76761c6963..cc9e783f616 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -139,20 +139,14 @@ MaybeConstructOverloadSet(ASTContext &Context, // nothing to leak. Ovl = OverloadedFunctionDecl::Create(Context, (*I)->getDeclContext(), (*I)->getDeclName()); - NamedDecl *ND = (*I); - if (UsingDecl *UD = dyn_cast<UsingDecl>(ND)) - ND = UD->getTargetDecl(); - + NamedDecl *ND = (*I)->getUnderlyingDecl(); if (isa<FunctionDecl>(ND)) Ovl->addOverload(cast<FunctionDecl>(ND)); else Ovl->addOverload(cast<FunctionTemplateDecl>(ND)); } - NamedDecl *ND = (*Last); - if (UsingDecl *UD = dyn_cast<UsingDecl>(ND)) - ND = UD->getTargetDecl(); - + NamedDecl *ND = (*Last)->getUnderlyingDecl(); if (isa<FunctionDecl>(ND)) Ovl->addOverload(cast<FunctionDecl>(ND)); else @@ -219,9 +213,7 @@ MergeLookupResults(ASTContext &Context, LookupResultsTy &Results) { break; case LResult::Found: { - NamedDecl *ND = I->getAsDecl(); - if (UsingDecl *UD = dyn_cast<UsingDecl>(ND)) - ND = UD->getTargetDecl(); + NamedDecl *ND = I->getAsDecl()->getUnderlyingDecl(); if (TagDecl *TD = dyn_cast<TagDecl>(ND)) { TagFound = Context.getCanonicalDecl(TD); @@ -333,11 +325,8 @@ getIdentifierNamespacesFromLookupNameKind(Sema::LookupNameKind NameKind, Sema::LookupResult Sema::LookupResult::CreateLookupResult(ASTContext &Context, NamedDecl *D) { - if (ObjCCompatibleAliasDecl *Alias - = dyn_cast_or_null<ObjCCompatibleAliasDecl>(D)) - D = Alias->getClassInterface(); - if (UsingDecl *UD = dyn_cast_or_null<UsingDecl>(D)) - D = UD->getTargetDecl(); + if (D) + D = D->getUnderlyingDecl(); LookupResult Result; Result.StoredKind = (D && isa<OverloadedFunctionDecl>(D))? @@ -367,12 +356,9 @@ Sema::LookupResult::CreateLookupResult(ASTContext &Context, } } - Decl *D = *F; - if (ObjCCompatibleAliasDecl *Alias - = dyn_cast_or_null<ObjCCompatibleAliasDecl>(D)) - D = Alias->getClassInterface(); - if (UsingDecl *UD = dyn_cast_or_null<UsingDecl>(D)) - D = UD->getTargetDecl(); + NamedDecl *D = *F; + if (D) + D = D->getUnderlyingDecl(); Result.StoredKind = SingleDecl; Result.First = reinterpret_cast<uintptr_t>(D); @@ -398,13 +384,10 @@ Sema::LookupResult::CreateLookupResult(ASTContext &Context, } } - Decl *D = *F; - if (ObjCCompatibleAliasDecl *Alias - = dyn_cast_or_null<ObjCCompatibleAliasDecl>(D)) - D = Alias->getClassInterface(); - if (UsingDecl *UD = dyn_cast_or_null<UsingDecl>(D)) - D = UD->getTargetDecl(); - + NamedDecl *D = *F; + if (D) + D = D->getUnderlyingDecl(); + Result.StoredKind = SingleDecl; Result.First = reinterpret_cast<uintptr_t>(D); Result.Last = 0; |