diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-05-20 23:34:56 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-05-20 23:34:56 +0000 |
commit | 2792f30f1378ca249a6fafbc56fade5ad9216d25 (patch) | |
tree | 1c16a3b491396a9bbd85da6d9b6625fb9b59bded | |
parent | fd8fb3c4cd64fb82bc7b0ae3ba6b8b40964e785a (diff) | |
download | bcm5719-llvm-2792f30f1378ca249a6fafbc56fade5ad9216d25.tar.gz bcm5719-llvm-2792f30f1378ca249a6fafbc56fade5ad9216d25.zip |
Generate objc_memmove_collectable write-barrier for
classes whose base class have GC'able object pointers.
llvm-svn: 104296
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 8 | ||||
-rw-r--r-- | clang/test/CodeGenObjC/objc-gc-aggr-assign.m | 11 |
2 files changed, 17 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e7933217f3d..05ce9e35e8f 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -622,7 +622,13 @@ bool Sema::AttachBaseSpecifiers(CXXRecordDecl *Class, CXXBaseSpecifier **Bases, QualType NewBaseType = Context.getCanonicalType(Bases[idx]->getType()); NewBaseType = NewBaseType.getLocalUnqualifiedType(); - + if (!Class->hasObjectMember()) { + if (const RecordType *FDTTy = + NewBaseType.getTypePtr()->getAs<RecordType>()) + if (FDTTy->getDecl()->hasObjectMember()) + Class->setHasObjectMember(true); + } + if (KnownBaseTypes[NewBaseType]) { // C++ [class.mi]p3: // A class shall not be specified as a direct base class of a diff --git a/clang/test/CodeGenObjC/objc-gc-aggr-assign.m b/clang/test/CodeGenObjC/objc-gc-aggr-assign.m index 1d726d4354a..88516727752 100644 --- a/clang/test/CodeGenObjC/objc-gc-aggr-assign.m +++ b/clang/test/CodeGenObjC/objc-gc-aggr-assign.m @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o %t %s // RUN: grep objc_memmove_collectable %t | grep call | count 3 // RUN: %clang_cc1 -x objective-c++ -triple x86_64-apple-darwin10 -fobjc-gc -emit-llvm -o %t %s -// RUN: grep objc_memmove_collectable %t | grep call | count 3 +// RUN: grep objc_memmove_collectable %t | grep call | count 4 static int count; @@ -46,3 +46,12 @@ void f(const struct type_s *in, struct type_s *out) { *out = *in; } +#ifdef __cplusplus +struct Derived : type_s { }; + +void foo(Derived* src, Derived* dest) { + *dest = *src; +} + +#endif + |