diff options
-rw-r--r-- | clang/Sema/SemaDecl.cpp | 14 | ||||
-rw-r--r-- | clang/include/clang/AST/DeclObjC.h | 8 | ||||
-rw-r--r-- | clang/include/clang/AST/Type.h | 1 |
3 files changed, 11 insertions, 12 deletions
diff --git a/clang/Sema/SemaDecl.cpp b/clang/Sema/SemaDecl.cpp index 8f743789e84..5916f4cccbe 100644 --- a/clang/Sema/SemaDecl.cpp +++ b/clang/Sema/SemaDecl.cpp @@ -1036,13 +1036,12 @@ Sema::ActOnFindProtocolDeclaration(Scope *S, Action::DeclTy * Sema::ActOnForwardProtocolDeclaration(Scope *S, SourceLocation AtProtocolLoc, IdentifierInfo **IdentList, unsigned NumElts) { - ObjcForwardProtocolDecl *FDecl = new ObjcForwardProtocolDecl(AtProtocolLoc, - NumElts); + llvm::SmallVector<ObjcProtocolDecl*, 32> Protocols; for (unsigned i = 0; i != NumElts; ++i) { - ObjcProtocolDecl *PDecl; - PDecl = getObjCProtocolDecl(S, IdentList[i], AtProtocolLoc); - if (!PDecl) {// Already seen? + ObjcProtocolDecl *PDecl = getObjCProtocolDecl(S, IdentList[i], + AtProtocolLoc); + if (!PDecl) { // Already seen? PDecl = new ObjcProtocolDecl(SourceLocation(), 0, IdentList[i], true); // Chain & install the protocol decl into the identifier. PDecl->setNext(IdentList[i]->getFETokenInfo<ScopedDecl>()); @@ -1051,9 +1050,10 @@ Sema::ActOnForwardProtocolDeclaration(Scope *S, SourceLocation AtProtocolLoc, // Remember that this needs to be removed when the scope is popped. S->AddDecl(IdentList[i]); - FDecl->setForwardProtocolDecl((int)i, PDecl); + Protocols.push_back(PDecl); } - return FDecl; + return new ObjcForwardProtocolDecl(AtProtocolLoc, + &Protocols[0], Protocols.size()); } Sema::DeclTy *Sema::ActOnStartCategoryInterface(Scope* S, diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index 0d1bc7fb6d0..0f4e8d76b50 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -381,12 +381,13 @@ class ObjcForwardProtocolDecl : public TypeDecl { ObjcProtocolDecl **ReferencedProtocols; unsigned NumReferencedProtocols; public: - ObjcForwardProtocolDecl(SourceLocation L, unsigned nElts) + ObjcForwardProtocolDecl(SourceLocation L, + ObjcProtocolDecl **Elts, unsigned nElts) : TypeDecl(ObjcForwardProtocol, L, 0, 0) { + NumReferencedProtocols = nElts; if (nElts) { ReferencedProtocols = new ObjcProtocolDecl*[nElts]; - memset(ReferencedProtocols, '\0', nElts*sizeof(ObjcProtocolDecl*)); - NumReferencedProtocols = nElts; + memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjcProtocolDecl*)); } else { ReferencedProtocols = 0; } @@ -407,7 +408,6 @@ public: return ReferencedProtocols[idx]; } - static bool classof(const Decl *D) { return D->getKind() == ObjcForwardProtocol; } diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 7abc62e0ecf..f2c49473123 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -326,7 +326,6 @@ private: friend class QualType; public: virtual void getAsStringInternal(std::string &InnerString) const = 0; - static bool classof(const Type *) { return true; } }; |