]> granicus.if.org Git - clang/commitdiff
In ARC, don't reclaim objects of Class type.
authorJohn McCall <rjmccall@apple.com>
Mon, 14 Nov 2011 19:53:16 +0000 (19:53 +0000)
committerJohn McCall <rjmccall@apple.com>
Mon, 14 Nov 2011 19:53:16 +0000 (19:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144561 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExprCXX.cpp
test/CodeGenObjC/arc.m

index 6c533c4ed4925eb385f2b315dace577997298e68..b4db312d6cc2a3669df7460c66c14a4fb39faebd 100644 (file)
@@ -4092,6 +4092,10 @@ ExprResult Sema::MaybeBindToTemporary(Expr *E) {
         return Owned(E);
     }
 
+    // Don't reclaim an object of Class type.
+    if (!ReturnsRetained && E->getType()->isObjCARCImplicitlyUnretainedType())
+      return Owned(E);
+
     ExprNeedsCleanups = true;
 
     CastKind ck = (ReturnsRetained ? CK_ARCConsumeObject
index 47da27c38558604270668f80bc0a29f7ac21d7bb..492c1b89da12b5ff3d806a679e9f42b31190da28 100644 (file)
@@ -1508,3 +1508,27 @@ void test66(void) {
 // CHECK-NEXT: [[T8:%.*]] = bitcast [[TEST66]]* [[T3]] to i8*
 // CHECK-NEXT: call void @objc_release(i8* [[T8]])
 // CHECK-NEXT: ret void
+
+// rdar://problem/9953540
+Class test67_helper(void);
+void test67(void) {
+  Class cl = test67_helper();
+}
+// CHECK:    define void @test67()
+// CHECK:      [[CL:%.*]] = alloca i8*, align 8
+// CHECK-NEXT: [[T0:%.*]] = call i8* @test67_helper()
+// CHECK-NEXT: store i8* [[T0]], i8** [[CL]], align 8
+// CHECK-NEXT: ret void
+
+Class test68_helper(void);
+void test68(void) {
+  __strong Class cl = test67_helper();
+}
+// CHECK:    define void @test68()
+// CHECK:      [[CL:%.*]] = alloca i8*, align 8
+// CHECK-NEXT: [[T0:%.*]] = call i8* @test67_helper()
+// CHECK-NEXT: [[T1:%.*]] = call i8* @objc_retainAutoreleasedReturnValue(i8* [[T0]])
+// CHECK-NEXT: store i8* [[T1]], i8** [[CL]], align 8
+// CHECK-NEXT: [[T2:%.*]] = load i8** [[CL]]
+// CHECK-NEXT: call void @objc_release(i8* [[T2]])
+// CHECK-NEXT: ret void