From: John McCall Date: Mon, 14 Nov 2011 19:53:16 +0000 (+0000) Subject: In ARC, don't reclaim objects of Class type. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=567c5862be3e278bfc14778612f2d66eafdc4724;p=clang In ARC, don't reclaim objects of Class type. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144561 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 6c533c4ed4..b4db312d6c 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -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 diff --git a/test/CodeGenObjC/arc.m b/test/CodeGenObjC/arc.m index 47da27c385..492c1b89da 100644 --- a/test/CodeGenObjC/arc.m +++ b/test/CodeGenObjC/arc.m @@ -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