diff --git a/clang/Driver/ASTConsumers.cpp b/clang/Driver/ASTConsumers.cpp index 397170e60d2c..f3bfc0b4345a 100644 --- a/clang/Driver/ASTConsumers.cpp +++ b/clang/Driver/ASTConsumers.cpp @@ -97,10 +97,10 @@ void DeclPrinter:: PrintDecl(Decl *D) { } else if (ObjCForwardProtocolDecl *OFPD = dyn_cast(D)) { Out << "@protocol "; - for (unsigned i = 0, e = OFPD->getNumForwardDecls(); i != e; ++i) { - const ObjCProtocolDecl *D = OFPD->getForwardProtocolDecl(i); - if (i) Out << ", "; - Out << D->getNameAsString(); + for (ObjCForwardProtocolDecl::iterator I = OFPD->begin(), E = OFPD->end(); + I != E; ++I) { + if (I != OFPD->begin()) Out << ", "; + Out << (*I)->getNameAsString(); } Out << ";\n"; } else if (ObjCImplementationDecl *OID = diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index 10f59bcadfef..efd5242953d9 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -658,44 +658,25 @@ public: /// /// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo; /// -/// FIXME: Should this be a transparent DeclContext? class ObjCForwardProtocolDecl : public Decl { - ObjCProtocolDecl **ReferencedProtocols; - unsigned NumReferencedProtocols; + ObjCList ReferencedProtocols; ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L, - ObjCProtocolDecl **Elts, unsigned nElts); - virtual ~ObjCForwardProtocolDecl() { - assert(ReferencedProtocols == 0 && "Destroy not called?"); - } + ObjCProtocolDecl *const *Elts, unsigned nElts); + virtual ~ObjCForwardProtocolDecl() {} public: static ObjCForwardProtocolDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L, - ObjCProtocolDecl **Elts, unsigned Num); + ObjCProtocolDecl *const *Elts, + unsigned Num); /// Destroy - Call destructors and release memory. virtual void Destroy(ASTContext& C); - - void setForwardProtocolDecl(unsigned idx, ObjCProtocolDecl *OID) { - assert(idx < NumReferencedProtocols && "index out of range"); - ReferencedProtocols[idx] = OID; - } - unsigned getNumForwardDecls() const { return NumReferencedProtocols; } - - ObjCProtocolDecl *getForwardProtocolDecl(unsigned idx) { - assert(idx < NumReferencedProtocols && "index out of range"); - return ReferencedProtocols[idx]; - } - const ObjCProtocolDecl *getForwardProtocolDecl(unsigned idx) const { - assert(idx < NumReferencedProtocols && "index out of range"); - return ReferencedProtocols[idx]; - } - - typedef ObjCProtocolDecl * const * iterator; - iterator begin() const { return ReferencedProtocols; } - iterator end() const { return ReferencedProtocols+NumReferencedProtocols; } + typedef ObjCList::iterator iterator; + iterator begin() const { return ReferencedProtocols.begin(); } + iterator end() const { return ReferencedProtocols.end(); } static bool classof(const Decl *D) { return D->getKind() == ObjCForwardProtocol; diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp index b0d36dbab8db..2ae7ccc81651 100644 --- a/clang/lib/AST/DeclObjC.cpp +++ b/clang/lib/AST/DeclObjC.cpp @@ -137,26 +137,21 @@ void ObjCClassDecl::Destroy(ASTContext &C) { ObjCForwardProtocolDecl * ObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L, - ObjCProtocolDecl **Elts, unsigned NumElts) { + ObjCProtocolDecl *const *Elts, + unsigned NumElts) { return new (C) ObjCForwardProtocolDecl(DC, L, Elts, NumElts); } ObjCForwardProtocolDecl:: ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L, - ObjCProtocolDecl **Elts, unsigned nElts) + ObjCProtocolDecl *const *Elts, unsigned nElts) : Decl(ObjCForwardProtocol, DC, L) { - NumReferencedProtocols = nElts; - if (nElts) { - ReferencedProtocols = new ObjCProtocolDecl*[nElts]; - memcpy(ReferencedProtocols, Elts, nElts*sizeof(ObjCProtocolDecl*)); - } else { - ReferencedProtocols = 0; - } + ReferencedProtocols.set(Elts, nElts); } void ObjCForwardProtocolDecl::Destroy(ASTContext &C) { - delete [] ReferencedProtocols; - ReferencedProtocols = 0; + ReferencedProtocols.clear(); + Decl::Destroy(C); } ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC,