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