From 516ff43cc4e20b637335d3dfa5b197ca8faa09cb Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 24 Apr 2009 02:57:34 +0000 Subject: [PATCH] Eliminate Sema::ObjCAliasDecls. This is based on Steve's fix, but also updates name lookup so that we see through @compatibility_alias declarations to their underlying interfaces. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69950 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/Sema.h | 8 -------- lib/Sema/SemaDecl.cpp | 12 ++++++++++++ lib/Sema/SemaDeclObjC.cpp | 6 +----- lib/Sema/SemaLookup.cpp | 28 ++++++++++++++++------------ 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index d87d93105d..3544324ae5 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -172,14 +172,6 @@ public: /// we can check for duplicates and find local method declarations. llvm::SmallVector ObjCCategoryImpls; - /// ObjCAliasDecls - Keep track of all class declarations declared - /// with @compatibility_alias, so that we can emit errors on duplicates and - /// find the declarations when needed. This construct is ancient and will - /// likely never be seen. Nevertheless, it is here for compatibility. - typedef llvm::DenseMap ObjCAliasTy; - ObjCAliasTy ObjCAliasDecls; - /// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes. llvm::OwningPtr FieldCollector; diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index e81e883272..63b006277c 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -299,6 +299,18 @@ void Sema::PushOnScopeChains(NamedDecl *D, Scope *S) { S->RemoveDecl(DeclPtrTy::make(*Redecl)); IdResolver.RemoveDecl(*Redecl); } + } else if (isa(D)) { + // We're pushing an Objective-C interface into the current + // context. If there is already an alias declaration, remove it first. + for (IdentifierResolver::iterator + I = IdResolver.begin(D->getDeclName()), IEnd = IdResolver.end(); + I != IEnd; ++I) { + if (isa(*I)) { + S->RemoveDecl(DeclPtrTy::make(*I)); + IdResolver.RemoveDecl(*I); + break; + } + } } IdResolver.AddDecl(D); diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index c30a7b26e1..f4014d1f25 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -201,12 +201,8 @@ Sema::DeclPtrTy Sema::ActOnCompatiblityAlias(SourceLocation AtLoc, ObjCCompatibleAliasDecl *AliasDecl = ObjCCompatibleAliasDecl::Create(Context, CurContext, AtLoc, AliasName, CDecl); - ObjCAliasDecls[AliasName] = AliasDecl; - - // FIXME: PushOnScopeChains? - CurContext->addDecl(Context, AliasDecl); if (!CheckObjCDeclScope(AliasDecl)) - TUScope->AddDecl(DeclPtrTy::make(AliasDecl)); + PushOnScopeChains(AliasDecl, TUScope); return DeclPtrTy::make(AliasDecl); } diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index df869d9a6b..b1643bb50b 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -311,6 +311,10 @@ getIdentifierNamespacesFromLookupNameKind(Sema::LookupNameKind NameKind, Sema::LookupResult Sema::LookupResult::CreateLookupResult(ASTContext &Context, NamedDecl *D) { + if (ObjCCompatibleAliasDecl *Alias + = dyn_cast_or_null(D)) + D = Alias->getClassInterface(); + LookupResult Result; Result.StoredKind = (D && isa(D))? OverloadedDeclSingleDecl : SingleDecl; @@ -338,9 +342,14 @@ Sema::LookupResult::CreateLookupResult(ASTContext &Context, return Result; } } + + Decl *D = *F; + if (ObjCCompatibleAliasDecl *Alias + = dyn_cast_or_null(D)) + D = Alias->getClassInterface(); Result.StoredKind = SingleDecl; - Result.First = reinterpret_cast(*F); + Result.First = reinterpret_cast(D); Result.Last = 0; return Result; } @@ -362,9 +371,14 @@ Sema::LookupResult::CreateLookupResult(ASTContext &Context, return Result; } } + + Decl *D = *F; + if (ObjCCompatibleAliasDecl *Alias + = dyn_cast_or_null(D)) + D = Alias->getClassInterface(); Result.StoredKind = SingleDecl; - Result.First = reinterpret_cast(*F); + Result.First = reinterpret_cast(D); Result.Last = 0; return Result; } @@ -930,16 +944,6 @@ Sema::LookupName(Scope *S, DeclarationName Name, LookupNameKind NameKind, S, RedeclarationOnly, Loc)); } } - if (getLangOptions().ObjC1 && II) { - // @interface and @compatibility_alias introduce typedef-like names. - // Unlike typedef's, they can only be introduced at file-scope (and are - // therefore not scoped decls). They can, however, be shadowed by - // other names in IDNS_Ordinary. - ObjCAliasTy::iterator I = ObjCAliasDecls.find(II); - if (I != ObjCAliasDecls.end()) - return LookupResult::CreateLookupResult(Context, - I->second->getClassInterface()); - } } return LookupResult::CreateLookupResult(Context, 0); } -- 2.40.0