Change ObjCForwardProtocolDecl to use an ObjCList.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65131 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index 397170e..f3bfc0b 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -97,10 +97,10 @@
} else if (ObjCForwardProtocolDecl *OFPD =
dyn_cast<ObjCForwardProtocolDecl>(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/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index 10f59bc..efd5242 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -658,44 +658,25 @@
///
/// @protocol NSTextInput, NSChangeSpelling, NSDraggingInfo;
///
-/// FIXME: Should this be a transparent DeclContext?
class ObjCForwardProtocolDecl : public Decl {
- ObjCProtocolDecl **ReferencedProtocols;
- unsigned NumReferencedProtocols;
+ ObjCList<ObjCProtocolDecl> 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<ObjCProtocolDecl>::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/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index b0d36db..2ae7ccc 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -137,26 +137,21 @@
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,