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.

llvm-svn: 69950
This commit is contained in:
Douglas Gregor 2009-04-24 02:57:34 +00:00
parent 4742515771
commit 38feed810f
4 changed files with 29 additions and 25 deletions

View File

@ -172,14 +172,6 @@ public:
/// we can check for duplicates and find local method declarations.
llvm::SmallVector<ObjCCategoryImplDecl*, 8> 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<const IdentifierInfo*,
ObjCCompatibleAliasDecl*> ObjCAliasTy;
ObjCAliasTy ObjCAliasDecls;
/// FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
llvm::OwningPtr<CXXFieldCollector> FieldCollector;

View File

@ -299,6 +299,18 @@ void Sema::PushOnScopeChains(NamedDecl *D, Scope *S) {
S->RemoveDecl(DeclPtrTy::make(*Redecl));
IdResolver.RemoveDecl(*Redecl);
}
} else if (isa<ObjCInterfaceDecl>(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<ObjCCompatibleAliasDecl>(*I)) {
S->RemoveDecl(DeclPtrTy::make(*I));
IdResolver.RemoveDecl(*I);
break;
}
}
}
IdResolver.AddDecl(D);

View File

@ -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);
}

View File

@ -311,6 +311,10 @@ 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();
LookupResult Result;
Result.StoredKind = (D && isa<OverloadedFunctionDecl>(D))?
OverloadedDeclSingleDecl : SingleDecl;
@ -338,9 +342,14 @@ Sema::LookupResult::CreateLookupResult(ASTContext &Context,
return Result;
}
}
Decl *D = *F;
if (ObjCCompatibleAliasDecl *Alias
= dyn_cast_or_null<ObjCCompatibleAliasDecl>(D))
D = Alias->getClassInterface();
Result.StoredKind = SingleDecl;
Result.First = reinterpret_cast<uintptr_t>(*F);
Result.First = reinterpret_cast<uintptr_t>(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<ObjCCompatibleAliasDecl>(D))
D = Alias->getClassInterface();
Result.StoredKind = SingleDecl;
Result.First = reinterpret_cast<uintptr_t>(*F);
Result.First = reinterpret_cast<uintptr_t>(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);
}