diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-04-28 16:11:27 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-04-28 16:11:27 +0000 |
commit | e4498c6d66a8f472cba29b6158a2e86dfc60d0ef (patch) | |
tree | 224bcda2afc6a682f9dcf16b0a327d678e8d358d /lib/Sema/SemaDeclObjC.cpp | |
parent | 07c55e36a0d1625c38354f6814099c5951e94202 (diff) |
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
Diffstat (limited to 'lib/Sema/SemaDeclObjC.cpp')
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 1324e05b6d..8032030cf0 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -1441,6 +1441,7 @@ void Sema::ActOnAtEnd(SourceRange AtEnd, IDecl = IDecl->getSuperClass(); } } + SetIvarInitializers(IC); } else if (ObjCCategoryImplDecl* CatImplClass = dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) { CatImplClass->setAtEndRange(AtEnd); @@ -1800,23 +1801,15 @@ Sema::DeclPtrTy Sema::ActOnObjCExceptionDecl(Scope *S, Declarator &D) { } /// 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 @@ void Sema::CollectIvarsToConstructOrDestruct(const ObjCInterfaceDecl *OI, 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 @@ void Sema::CollectIvarsToConstructOrDestruct(const ObjCInterfaceDecl *OI, 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; + } +} + |