diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 49 | ||||
| -rw-r--r-- | clang/lib/Sema/Sema.h | 6 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 52 | 
3 files changed, 58 insertions, 49 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 0a39575c431..91fafbabc2a 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -807,55 +807,6 @@ void ASTContext::CollectInheritedProtocols(const Decl *CDecl,    }  } -/// CollectIvarsToConstructOrDestruct - Collect those ivars which require -/// construction (construct=true) or destruction (construct=false) -/// -void ASTContext::CollectIvarsToConstructOrDestruct(const ObjCInterfaceDecl *OI, -                                llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars, -                                bool construct) { -  if (!getLangOptions().CPlusPlus) -    return; -  for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(), -       E = OI->ivar_end(); I != E; ++I) { -    ObjCIvarDecl *Iv = (*I); -    if (const RecordType *RT = Iv->getType()->getAs<RecordType>()) { -      if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) -        if (construct && !RD->hasTrivialConstructor() || -            !construct && !RD->hasTrivialDestructor()) -          Ivars.push_back(*I); -    } -  } -   -  // Find ivars to construct/destruct in class extension. -  if (const ObjCCategoryDecl *CDecl = OI->getClassExtension()) { -    for (ObjCCategoryDecl::ivar_iterator I = CDecl->ivar_begin(), -         E = CDecl->ivar_end(); I != E; ++I) { -      ObjCIvarDecl *Iv = (*I); -      if (const RecordType *RT = Iv->getType()->getAs<RecordType>()) { -        if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) -          if (construct && !RD->hasTrivialConstructor() || -              !construct && !RD->hasTrivialDestructor()) -            Ivars.push_back(*I); -      } -    } -  } -   -  // Also add any ivar defined in this class's implementation.  This -  // includes synthesized ivars. -  if (ObjCImplementationDecl *ImplDecl = OI->getImplementation()) { -    for (ObjCImplementationDecl::ivar_iterator I = ImplDecl->ivar_begin(), -         E = ImplDecl->ivar_end(); I != E; ++I) { -      ObjCIvarDecl *Iv = (*I); -      if (const RecordType *RT = Iv->getType()->getAs<RecordType>()) { -        if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) -          if (construct && !RD->hasTrivialConstructor() || -              !construct && !RD->hasTrivialDestructor()) -            Ivars.push_back(*I); -      } -    } -  } -} -  unsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) {    unsigned count = 0;      // Count ivars declared in class extension. diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index 212a36f3ccb..f22c1ad8527 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -1590,6 +1590,12 @@ public:    /// AddFactoryMethodToGlobalPool - Same as above, but for factory methods.    void AddFactoryMethodToGlobalPool(ObjCMethodDecl *Method); +   +  /// CollectIvarsToConstructOrDestruct - Collect those ivars which require +  /// construction (construct=true) or destruction (construct=false) +  void CollectIvarsToConstructOrDestruct(const ObjCInterfaceDecl *OI, +                                    llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars, +                                    bool construct=true);    //===--------------------------------------------------------------------===//    // Statement Parsing Callbacks: SemaStmt.cpp.  public: diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 0e93ebda085..1324e05b6d9 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -1798,3 +1798,55 @@ Sema::DeclPtrTy Sema::ActOnObjCExceptionDecl(Scope *S, Declarator &D) {      Diag(New->getLocation(), diag::err_block_on_nonlocal);    return DeclPtrTy::make(New);  } + +/// CollectIvarsToConstructOrDestruct - Collect those ivars which require +/// construction (construct=true) or destruction (construct=false) +/// +void Sema::CollectIvarsToConstructOrDestruct(const ObjCInterfaceDecl *OI, +                                    llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars, +                                    bool construct) { +  if (!getLangOptions().CPlusPlus) +    return; +  for (ObjCInterfaceDecl::ivar_iterator I = OI->ivar_begin(), +       E = OI->ivar_end(); I != E; ++I) { +    ObjCIvarDecl *Iv = (*I); +    QualType QT = Context.getBaseElementType(Iv->getType()); +    if (const RecordType *RT = QT->getAs<RecordType>()) { +      if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) +        if (construct && !RD->hasTrivialConstructor() || +            !construct && !RD->hasTrivialDestructor()) +          Ivars.push_back(*I); +    } +  } +   +  // Find ivars to construct/destruct in class extension. +  if (const ObjCCategoryDecl *CDecl = OI->getClassExtension()) { +    for (ObjCCategoryDecl::ivar_iterator I = CDecl->ivar_begin(), +         E = CDecl->ivar_end(); I != E; ++I) { +      ObjCIvarDecl *Iv = (*I); +      QualType QT = Context.getBaseElementType(Iv->getType()); +      if (const RecordType *RT = QT->getAs<RecordType>()) { +        if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) +          if (construct && !RD->hasTrivialConstructor() || +              !construct && !RD->hasTrivialDestructor()) +            Ivars.push_back(*I); +      } +    } +  } +   +  // Also add any ivar defined in this class's implementation.  This +  // includes synthesized ivars. +  if (ObjCImplementationDecl *ImplDecl = OI->getImplementation()) { +    for (ObjCImplementationDecl::ivar_iterator I = ImplDecl->ivar_begin(), +         E = ImplDecl->ivar_end(); I != E; ++I) { +      ObjCIvarDecl *Iv = (*I); +      QualType QT = Context.getBaseElementType(Iv->getType()); +      if (const RecordType *RT = QT->getAs<RecordType>()) { +        if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) +          if (construct && !RD->hasTrivialConstructor() || +              !construct && !RD->hasTrivialDestructor()) +            Ivars.push_back(*I); +      } +    } +  } +}  | 

