aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/Sema.h8
-rw-r--r--lib/Sema/SemaDecl.cpp12
-rw-r--r--lib/Sema/SemaDeclObjC.cpp6
-rw-r--r--lib/Sema/SemaLookup.cpp28
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<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;
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<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);
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<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);
}