diff options
-rw-r--r-- | lib/Frontend/PCHWriter.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/Sema.h | 20 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 15 | ||||
-rw-r--r-- | lib/Sema/SemaExprObjC.cpp | 2 | ||||
-rw-r--r-- | lib/Sema/SemaLookup.cpp | 14 |
5 files changed, 32 insertions, 21 deletions
diff --git a/lib/Frontend/PCHWriter.cpp b/lib/Frontend/PCHWriter.cpp index 11302d136e..985d297be1 100644 --- a/lib/Frontend/PCHWriter.cpp +++ b/lib/Frontend/PCHWriter.cpp @@ -1888,7 +1888,7 @@ void PCHWriter::WriteIdentifierTable(Preprocessor &PP) { } 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()); diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 5a53374033..8cf2af0577 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -176,11 +176,6 @@ public: /// 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. @@ -769,11 +764,13 @@ public: /// 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. @@ -1025,6 +1022,7 @@ public: case Sema::LookupTagName: case Sema::LookupMemberName: case Sema::LookupRedeclarationWithLinkage: // FIXME: check linkage, scoping + case Sema::LookupProtocolName: return D->isInIdentifierNamespace(IDNS); case Sema::LookupOperatorName: @@ -1058,6 +1056,8 @@ public: bool AllowBuiltinCreation = true, SourceLocation Loc = SourceLocation()); + ObjCProtocolDecl *LookupProtocol(IdentifierInfo *II); + void LookupOverloadedOperatorName(OverloadedOperatorKind Op, Scope *S, QualType T1, QualType T2, FunctionSet &Functions); diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 6702eb9a7a..7badaa3130 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -222,7 +222,7 @@ void Sema::CheckForwardProtocolDeclarationForCircularDependency( 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); @@ -243,7 +243,7 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc, 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()) { @@ -265,10 +265,8 @@ Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc, } 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); @@ -291,7 +289,7 @@ Sema::FindProtocolDeclaration(bool WarnOnDeclarations, 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; @@ -514,12 +512,11 @@ Sema::ActOnForwardProtocolDeclaration(SourceLocation AtProtocolLoc, 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); diff --git a/lib/Sema/SemaExprObjC.cpp b/lib/Sema/SemaExprObjC.cpp index 23f6f94dc0..1df7f3dcc9 100644 --- a/lib/Sema/SemaExprObjC.cpp +++ b/lib/Sema/SemaExprObjC.cpp @@ -128,7 +128,7 @@ Sema::ExprResult Sema::ParseObjCProtocolExpression(IdentifierInfo *ProtocolId, 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; diff --git a/lib/Sema/SemaLookup.cpp b/lib/Sema/SemaLookup.cpp index 0b11d9cf68..613c30bc0c 100644 --- a/lib/Sema/SemaLookup.cpp +++ b/lib/Sema/SemaLookup.cpp @@ -293,6 +293,10 @@ getIdentifierNamespacesFromLookupNameKind(Sema::LookupNameKind NameKind, case Sema::LookupNamespaceName: IDNS = Decl::IDNS_Ordinary | Decl::IDNS_Tag | Decl::IDNS_Member; break; + + case Sema::LookupProtocolName: + IDNS = Decl::IDNS_Protocol; + break; } return IDNS; } @@ -831,6 +835,10 @@ Sema::LookupName(Scope *S, DeclarationName Name, LookupNameKind NameKind, 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 @@ -1480,6 +1488,12 @@ IsAcceptableNonMemberOperatorCandidate(FunctionDecl *Fn, 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) { |