More of Sema to implement initialization of
ivar of c++ object types.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102500 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp
index 1324e05..8032030 100644
--- a/lib/Sema/SemaDeclObjC.cpp
+++ b/lib/Sema/SemaDeclObjC.cpp
@@ -1441,6 +1441,7 @@
IDecl = IDecl->getSuperClass();
}
}
+ SetIvarInitializers(IC);
} else if (ObjCCategoryImplDecl* CatImplClass =
dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) {
CatImplClass->setAtEndRange(AtEnd);
@@ -1800,23 +1801,15 @@
}
/// CollectIvarsToConstructOrDestruct - Collect those ivars which require
-/// construction (construct=true) or destruction (construct=false)
-///
+/// initialization.
void Sema::CollectIvarsToConstructOrDestruct(const ObjCInterfaceDecl *OI,
- llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars,
- bool construct) {
- if (!getLangOptions().CPlusPlus)
- return;
+ llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) {
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);
- }
+ if (isa<RecordType>(QT))
+ Ivars.push_back(*I);
}
// Find ivars to construct/destruct in class extension.
@@ -1825,12 +1818,8 @@
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);
- }
+ if (isa<RecordType>(QT))
+ Ivars.push_back(*I);
}
}
@@ -1841,12 +1830,22 @@
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);
- }
+ if (isa<RecordType>(QT))
+ Ivars.push_back(*I);
}
}
}
+
+void ObjCImplementationDecl::setIvarInitializers(ASTContext &C,
+ CXXBaseOrMemberInitializer ** initializers,
+ unsigned numInitializers) {
+ if (numInitializers > 0) {
+ NumIvarInitializers = numInitializers;
+ CXXBaseOrMemberInitializer **ivarInitializers =
+ new (C) CXXBaseOrMemberInitializer*[NumIvarInitializers];
+ memcpy(ivarInitializers, initializers,
+ numInitializers * sizeof(CXXBaseOrMemberInitializer*));
+ IvarInitializers = ivarInitializers;
+ }
+}
+