summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2010-05-20 23:34:56 +0000
committerFariborz Jahanian <fjahanian@apple.com>2010-05-20 23:34:56 +0000
commit2792f30f1378ca249a6fafbc56fade5ad9216d25 (patch)
tree1c16a3b491396a9bbd85da6d9b6625fb9b59bded
parentfd8fb3c4cd64fb82bc7b0ae3ba6b8b40964e785a (diff)
downloadbcm5719-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.cpp8
-rw-r--r--clang/test/CodeGenObjC/objc-gc-aggr-assign.m11
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
+
OpenPOWER on IntegriCloud