aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/ASTContext.cpp
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-04-26 23:51:25 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-04-26 23:51:25 +0000
commit184d7900e0202ac468710b731e42075129bb6000 (patch)
treedf37443e00e9007d45da8d78c2be15c8dabd9f37 /lib/AST/ASTContext.cpp
parent2b594b9b62e914770d736cc51a18598202d90945 (diff)
New method to construct/destruct ivars that have non-trivial default
constructors or destructors, not used yet. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102403 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/ASTContext.cpp')
-rw-r--r--lib/AST/ASTContext.cpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 41ba4c2d71..94d6891453 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -811,6 +811,55 @@ 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.