1*f4a2713aSLionel Sambuc// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-runtime-has-weak -fblocks -fobjc-arc -o - %s | FileCheck %s 2*f4a2713aSLionel Sambuc// rdar://8899430 3*f4a2713aSLionel Sambuc 4*f4a2713aSLionel Sambuc@interface WeakPropertyTest { 5*f4a2713aSLionel Sambuc __weak id PROP; 6*f4a2713aSLionel Sambuc} 7*f4a2713aSLionel Sambuc@property () __weak id PROP; 8*f4a2713aSLionel Sambuc@end 9*f4a2713aSLionel Sambuc 10*f4a2713aSLionel Sambuc@implementation WeakPropertyTest 11*f4a2713aSLionel Sambuc@synthesize PROP; 12*f4a2713aSLionel Sambuc@end 13*f4a2713aSLionel Sambuc 14*f4a2713aSLionel Sambuc// CHECK: define internal i8* @"\01-[WeakPropertyTest PROP]" 15*f4a2713aSLionel Sambuc// CHECK: [[SELF:%.*]] = alloca [[WPT:%.*]]*, 16*f4a2713aSLionel Sambuc// CHECK-NEXT: [[CMD:%.*]] = alloca i8*, 17*f4a2713aSLionel Sambuc// CHECK-NEXT: store [[WPT]]* {{%.*}}, [[WPT]]** [[SELF]] 18*f4a2713aSLionel Sambuc// CHECK-NEXT: store i8* {{%.*}}, i8** [[CMD]] 19*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T0:%.*]] = load [[WPT]]** [[SELF]] 20*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T1:%.*]] = load i64* @"OBJC_IVAR_$_WeakPropertyTest.PROP" 21*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T2:%.*]] = bitcast [[WPT]]* [[T0]] to i8* 22*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[T1]] 23*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8** 24*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T5:%.*]] = call i8* @objc_loadWeakRetained(i8** [[T4]]) 25*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T6:%.*]] = tail call i8* @objc_autoreleaseReturnValue(i8* [[T5]]) 26*f4a2713aSLionel Sambuc// CHECK-NEXT: ret i8* [[T6]] 27*f4a2713aSLionel Sambuc 28*f4a2713aSLionel Sambuc// CHECK: define internal void @"\01-[WeakPropertyTest setPROP:]" 29*f4a2713aSLionel Sambuc// CHECK: [[SELF:%.*]] = alloca [[WPT:%.*]]*, 30*f4a2713aSLionel Sambuc// CHECK-NEXT: [[CMD:%.*]] = alloca i8*, 31*f4a2713aSLionel Sambuc// CHECK-NEXT: [[PROP:%.*]] = alloca i8*, 32*f4a2713aSLionel Sambuc// CHECK-NEXT: store [[WPT]]* {{%.*}}, [[WPT]]** [[SELF]] 33*f4a2713aSLionel Sambuc// CHECK-NEXT: store i8* {{%.*}}, i8** [[CMD]] 34*f4a2713aSLionel Sambuc// CHECK-NEXT: store i8* {{%.*}}, i8** [[PROP]] 35*f4a2713aSLionel Sambuc// CHECK-NEXT: [[V:%.*]] = load i8** [[PROP]] 36*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T0:%.*]] = load [[WPT]]** [[SELF]] 37*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T1:%.*]] = load i64* @"OBJC_IVAR_$_WeakPropertyTest.PROP" 38*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T2:%.*]] = bitcast [[WPT]]* [[T0]] to i8* 39*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[T1]] 40*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8** 41*f4a2713aSLionel Sambuc// CHECK-NEXT: call i8* @objc_storeWeak(i8** [[T4]], i8* [[V]]) 42*f4a2713aSLionel Sambuc// CHECK-NEXT: ret void 43*f4a2713aSLionel Sambuc 44*f4a2713aSLionel Sambuc// CHECK: define internal void @"\01-[WeakPropertyTest .cxx_destruct]" 45*f4a2713aSLionel Sambuc// CHECK: [[SELF:%.*]] = alloca [[WPT:%.*]]*, 46*f4a2713aSLionel Sambuc// CHECK-NEXT: [[CMD:%.*]] = alloca i8*, 47*f4a2713aSLionel Sambuc// CHECK-NEXT: store [[WPT]]* {{%.*}}, [[WPT]]** [[SELF]] 48*f4a2713aSLionel Sambuc// CHECK-NEXT: store i8* {{%.*}}, i8** [[CMD]] 49*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T0:%.*]] = load [[WPT]]** [[SELF]] 50*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T1:%.*]] = load i64* @"OBJC_IVAR_$_WeakPropertyTest.PROP" 51*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T2:%.*]] = bitcast [[WPT]]* [[T0]] to i8* 52*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds i8* [[T2]], i64 [[T1]] 53*f4a2713aSLionel Sambuc// CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to i8** 54*f4a2713aSLionel Sambuc// CHECK-NEXT: call void @objc_destroyWeak(i8** [[T4]]) 55*f4a2713aSLionel Sambuc// CHECK-NEXT: ret void 56