From: Chris Lattner Date: Sat, 6 Oct 2007 20:08:36 +0000 (+0000) Subject: simplify the interface to create ObjcClassDecl's. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7e620729fcb5a0042107f999dcf524f7357ce819;p=clang simplify the interface to create ObjcClassDecl's. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@42706 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp index 5916f4cccb..71ba023dcf 100644 --- a/Sema/SemaDecl.cpp +++ b/Sema/SemaDecl.cpp @@ -1372,12 +1372,11 @@ Action::DeclTy * Sema::ActOnForwardClassDeclaration(Scope *S, SourceLocation AtClassLoc, IdentifierInfo **IdentList, unsigned NumElts) { - ObjcClassDecl *CDecl = new ObjcClassDecl(AtClassLoc, NumElts); - + llvm::SmallVector Interfaces; + for (unsigned i = 0; i != NumElts; ++i) { - ObjcInterfaceDecl *IDecl; - IDecl = getObjCInterfaceDecl(IdentList[i]); - if (!IDecl) {// Already seen? + ObjcInterfaceDecl *IDecl = getObjCInterfaceDecl(IdentList[i]); + if (!IDecl) { // Not already seen? Make a forward decl. IDecl = new ObjcInterfaceDecl(SourceLocation(), 0, IdentList[i], true); // Chain & install the interface decl into the identifier. IDecl->setNext(IdentList[i]->getFETokenInfo()); @@ -1385,10 +1384,11 @@ Sema::ActOnForwardClassDeclaration(Scope *S, SourceLocation AtClassLoc, } // Remember that this needs to be removed when the scope is popped. S->AddDecl(IdentList[i]); - - CDecl->setInterfaceDecl((int)i, IDecl); + + Interfaces.push_back(IDecl); } - return CDecl; + + return new ObjcClassDecl(AtClassLoc, &Interfaces[0], Interfaces.size()); } diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h index 0f4e8d76b5..17b7adc00a 100644 --- a/include/clang/AST/DeclObjC.h +++ b/include/clang/AST/DeclObjC.h @@ -351,19 +351,21 @@ public: /// @class NSCursor, NSImage, NSPasteboard, NSWindow; /// class ObjcClassDecl : public TypeDecl { - ObjcInterfaceDecl **ForwardDecls; // Null if not defined. - int NumForwardDecls; // -1 if not defined. + ObjcInterfaceDecl **ForwardDecls; + unsigned NumForwardDecls; public: - ObjcClassDecl(SourceLocation L, unsigned nElts) + ObjcClassDecl(SourceLocation L, ObjcInterfaceDecl **Elts, unsigned nElts) : TypeDecl(ObjcClass, L, 0, 0) { if (nElts) { ForwardDecls = new ObjcInterfaceDecl*[nElts]; - memset(ForwardDecls, '\0', nElts*sizeof(ObjcInterfaceDecl*)); + memcpy(ForwardDecls, Elts, nElts*sizeof(ObjcInterfaceDecl*)); + } else { + ForwardDecls = 0; } NumForwardDecls = nElts; } - void setInterfaceDecl(int idx, ObjcInterfaceDecl *OID) { - assert((idx < NumForwardDecls) && "index out of range"); + void setInterfaceDecl(unsigned idx, ObjcInterfaceDecl *OID) { + assert(idx < NumForwardDecls && "index out of range"); ForwardDecls[idx] = OID; } static bool classof(const Decl *D) {