diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-01 23:35:25 +0000 | 
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-07-01 23:35:25 +0000 | 
| commit | 5c6af0a9989f068d8021e7453d5cda65844fdbb6 (patch) | |
| tree | 2140dc992f97446c3d0da51028e3a1642b5df128 | |
| parent | 873db258791b2c16ede203276737b3d46d5798bd (diff) | |
| download | bcm5719-llvm-5c6af0a9989f068d8021e7453d5cda65844fdbb6.tar.gz bcm5719-llvm-5c6af0a9989f068d8021e7453d5cda65844fdbb6.zip | |
Use Destroy for member initializer list clean up.
Per Doug's comments. Doug please review.
llvm-svn: 74666
| -rw-r--r-- | clang/include/clang/AST/DeclCXX.h | 22 | ||||
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 7 | 
3 files changed, 26 insertions, 13 deletions
| diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index d5ae20d356d..a6e55ea65ab 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/include/clang/AST/DeclCXX.h @@ -710,8 +710,7 @@ class CXXConstructorDecl : public CXXMethodDecl {        BaseOrMemberInitializers(0), NumBaseOrMemberInitializers(0) {       setImplicit(isImplicitlyDeclared);    } -   -  ~CXXConstructorDecl() { delete [] BaseOrMemberInitializers; } +  virtual void Destroy(ASTContext& C);  public:    static CXXConstructorDecl *Create(ASTContext &C, CXXRecordDecl *RD, @@ -742,23 +741,23 @@ public:      ImplicitlyDefined = ID;     } -  /// arg_iterator - Iterates through the member/base initializer list. -  typedef CXXBaseOrMemberInitializer **arg_iterator; +  /// init_iterator - Iterates through the member/base initializer list. +  typedef CXXBaseOrMemberInitializer **init_iterator; -  /// arg_const_iterator - Iterates through the memberbase initializer list. -  typedef CXXBaseOrMemberInitializer * const * arg_const_iterator; +  /// init_const_iterator - Iterates through the memberbase initializer list. +  typedef CXXBaseOrMemberInitializer * const * init_const_iterator;    /// begin() - Retrieve an iterator to the first initializer. -  arg_iterator       begin()       { return BaseOrMemberInitializers; } +  init_iterator       begin()       { return BaseOrMemberInitializers; }    /// begin() - Retrieve an iterator to the first initializer. -  arg_const_iterator begin() const { return BaseOrMemberInitializers; } +  init_const_iterator begin() const { return BaseOrMemberInitializers; }    /// end() - Retrieve an iterator past the last initializer. -  arg_iterator       end()       {  +  init_iterator       end()       {       return BaseOrMemberInitializers + NumBaseOrMemberInitializers;     }    /// end() - Retrieve an iterator past the last initializer. -  arg_const_iterator end() const {  +  init_const_iterator end() const {       return BaseOrMemberInitializers + NumBaseOrMemberInitializers;     } @@ -768,7 +767,8 @@ public:        return NumBaseOrMemberInitializers;     } -  void setBaseOrMemberInitializers(CXXBaseOrMemberInitializer **Initializers, +  void setBaseOrMemberInitializers(ASTContext &C, +                                   CXXBaseOrMemberInitializer **Initializers,                                     unsigned NumInitializers);    /// isDefaultConstructor - Whether this constructor is a default diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index f653943f1dd..9bdf07b29e5 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -409,17 +409,25 @@ CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD,  void  CXXConstructorDecl::setBaseOrMemberInitializers( +                                    ASTContext &C,                                      CXXBaseOrMemberInitializer **Initializers,                                      unsigned NumInitializers) {    if (NumInitializers > 0) {      NumBaseOrMemberInitializers = NumInitializers;      BaseOrMemberInitializers =  -    new CXXBaseOrMemberInitializer*[NumInitializers]; +      new (C, 8) CXXBaseOrMemberInitializer*[NumInitializers];       for (unsigned Idx = 0; Idx < NumInitializers; ++Idx)        BaseOrMemberInitializers[Idx] = Initializers[Idx];    }  } +void +CXXConstructorDecl::Destroy(ASTContext& C) { +  C.Deallocate(BaseOrMemberInitializers); +  this->~CXXMethodDecl(); +  C.Deallocate((void *)this); +} +  CXXConversionDecl *  CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD,                            SourceLocation L, DeclarationName N, diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index bbb173a02ad..bef63a16d6c 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -782,7 +782,7 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl,      return;    }    llvm::DenseMap<void*, CXXBaseOrMemberInitializer *>Members; -   +  bool err = false;    for (unsigned i = 0; i < NumMemInits; i++) {      CXXBaseOrMemberInitializer *Member =         static_cast<CXXBaseOrMemberInitializer*>(MemInits[i]); @@ -811,7 +811,12 @@ void Sema::ActOnMemInitializers(DeclPtrTy ConstructorDecl,      }      Diag(PrevMember->getSourceLocation(), diag::note_previous_initializer)        << 0; +    err = true;    } +  if (!err) +    Constructor->setBaseOrMemberInitializers(Context,  +                    reinterpret_cast<CXXBaseOrMemberInitializer **>(MemInits),  +                    NumMemInits);  }  namespace { | 

