}
void PCHWriter::WriteSelectorTable() {
- Stream.EnterSubblock(pch::SELECTOR_BLOCK_ID, 3);
+ Stream.EnterSubblock(pch::SELECTOR_BLOCK_ID, 2);
RecordData Record;
Record.push_back(pch::SELECTOR_TABLE);
Record.push_back(SelectorIDs.size());
/// we can check for duplicates and find local method declarations.
llvm::SmallVector<ObjCCategoryImplDecl*, 8> ObjCCategoryImpls;
- /// ObjCProtocols - Keep track of all protocol declarations declared
- /// with @protocol keyword, so that we can emit errors on duplicates and
- /// find the declarations when needed.
- llvm::DenseMap<IdentifierInfo*, ObjCProtocolDecl*> ObjCProtocols;
-
/// ObjCInterfaceDecls - Keep track of all class declarations declared
/// with @interface, so that we can emit errors on duplicates and
/// find the declarations when needed.
/// namespace alias definition, ignoring non-namespace names (C++
/// [basic.lookup.udir]p1).
LookupNamespaceName,
- // Look up an ordinary name that is going to be redeclared as a
- // name with linkage. This lookup ignores any declarations that
- // are outside of the current scope unless they have linkage. See
- // C99 6.2.2p4-5 and C++ [basic.link]p6.
- LookupRedeclarationWithLinkage
+ /// Look up an ordinary name that is going to be redeclared as a
+ /// name with linkage. This lookup ignores any declarations that
+ /// are outside of the current scope unless they have linkage. See
+ /// C99 6.2.2p4-5 and C++ [basic.link]p6.
+ LookupRedeclarationWithLinkage,
+ /// Look up the name of an Objective-C protocol.
+ LookupProtocolName
};
/// @brief Represents the results of name lookup.
case Sema::LookupTagName:
case Sema::LookupMemberName:
case Sema::LookupRedeclarationWithLinkage: // FIXME: check linkage, scoping
+ case Sema::LookupProtocolName:
return D->isInIdentifierNamespace(IDNS);
case Sema::LookupOperatorName:
bool AllowBuiltinCreation = true,
SourceLocation Loc = SourceLocation());
+ ObjCProtocolDecl *LookupProtocol(IdentifierInfo *II);
+
void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S,
QualType T1, QualType T2,
FunctionSet &Functions);
for (ObjCList<ObjCProtocolDecl>::iterator I = PList.begin(),
E = PList.end(); I != E; ++I) {
- if (ObjCProtocolDecl *PDecl = ObjCProtocols[(*I)->getIdentifier()]) {
+ if (ObjCProtocolDecl *PDecl = LookupProtocol((*I)->getIdentifier())) {
if (PDecl->getIdentifier() == PName) {
Diag(Ploc, diag::err_protocol_has_circular_dependency);
Diag(PrevLoc, diag::note_previous_definition);
AttributeList *AttrList) {
// FIXME: Deal with AttrList.
assert(ProtocolName && "Missing protocol identifier");
- ObjCProtocolDecl *PDecl = ObjCProtocols[ProtocolName];
+ ObjCProtocolDecl *PDecl = LookupProtocol(ProtocolName);
if (PDecl) {
// Protocol already seen. Better be a forward protocol declaration
if (!PDecl->isForwardDecl()) {
} else {
PDecl = ObjCProtocolDecl::Create(Context, CurContext,
AtProtoInterfaceLoc,ProtocolName);
- // FIXME: PushOnScopeChains?
- CurContext->addDecl(Context, PDecl);
+ PushOnScopeChains(PDecl, TUScope);
PDecl->setForwardDecl(false);
- ObjCProtocols[ProtocolName] = PDecl;
}
if (AttrList)
ProcessDeclAttributeList(PDecl, AttrList);
unsigned NumProtocols,
llvm::SmallVectorImpl<DeclPtrTy> &Protocols) {
for (unsigned i = 0; i != NumProtocols; ++i) {
- ObjCProtocolDecl *PDecl = ObjCProtocols[ProtocolId[i].first];
+ ObjCProtocolDecl *PDecl = LookupProtocol(ProtocolId[i].first);
if (!PDecl) {
Diag(ProtocolId[i].second, diag::err_undeclared_protocol)
<< ProtocolId[i].first;
for (unsigned i = 0; i != NumElts; ++i) {
IdentifierInfo *Ident = IdentList[i].first;
- ObjCProtocolDecl *&PDecl = ObjCProtocols[Ident];
+ ObjCProtocolDecl *PDecl = LookupProtocol(Ident);
if (PDecl == 0) { // Not already seen?
PDecl = ObjCProtocolDecl::Create(Context, CurContext,
IdentList[i].second, Ident);
- // FIXME: PushOnScopeChains?
- CurContext->addDecl(Context, PDecl);
+ PushOnScopeChains(PDecl, TUScope);
}
if (attrList)
ProcessDeclAttributeList(PDecl, attrList);
SourceLocation ProtoLoc,
SourceLocation LParenLoc,
SourceLocation RParenLoc) {
- ObjCProtocolDecl* PDecl = ObjCProtocols[ProtocolId];
+ ObjCProtocolDecl* PDecl = LookupProtocol(ProtocolId);
if (!PDecl) {
Diag(ProtoLoc, diag::err_undeclared_protocol) << ProtocolId;
return true;
case Sema::LookupNamespaceName:
IDNS = Decl::IDNS_Ordinary | Decl::IDNS_Tag | Decl::IDNS_Member;
break;
+
+ case Sema::LookupProtocolName:
+ IDNS = Decl::IDNS_Protocol;
+ break;
}
return IDNS;
}
S = S->getParent();
IDNS = Decl::IDNS_Ordinary;
break;
+
+ case Sema::LookupProtocolName:
+ IDNS = Decl::IDNS_Protocol;
+ break;
}
// Scan up the scope chain looking for a decl that matches this
return false;
}
+/// \brief Find the protocol with the given name, if any.
+ObjCProtocolDecl *Sema::LookupProtocol(IdentifierInfo *II) {
+ Decl *D = LookupName(TUScope, II, LookupProtocolName).getAsDecl();
+ return cast_or_null<ObjCProtocolDecl>(D);
+}
+
void Sema::LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S,
QualType T1, QualType T2,
FunctionSet &Functions) {