blob: ed32ce8871ca791adcece3b08f00553f7ca0af94 [file] [log] [blame]
// RUN: %target-swift-frontend %s -emit-ir | FileCheck %s
// REQUIRES: CPU=x86_64
import Swift
class C {}
sil_vtable C {}
struct JustWeak {
weak var x: C?
}
struct NoWeak {
var x, y: C
}
struct SomeWeak {
var x: C
weak var y: C?
}
struct Gen<T> {
var x: C
var y: T
}
// CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @_TwTKV20weak_value_witnesses8JustWeak(
// CHECK: [[DEST:%.*]] = bitcast [24 x i8]* %dest to %V20weak_value_witnesses8JustWeak*
// CHECK-NEXT: [[SRC:%.*]] = bitcast [24 x i8]* %src to %V20weak_value_witnesses8JustWeak*
// CHECK-NEXT: [[DEST_X:%.*]] = getelementptr inbounds %V20weak_value_witnesses8JustWeak, %V20weak_value_witnesses8JustWeak* [[DEST]], i32 0, i32 0
// CHECK-NEXT: [[SRC_X:%.*]] = getelementptr inbounds %V20weak_value_witnesses8JustWeak, %V20weak_value_witnesses8JustWeak* [[SRC]], i32 0, i32 0
// CHECK-NEXT: call void @swift_weakTakeInit(%swift.weak* [[DEST_X]], %swift.weak* [[SRC_X]])
// CHECK-NEXT: [[T0:%.*]] = bitcast %V20weak_value_witnesses8JustWeak* [[DEST]] to %swift.opaque*
// CHECK-NEXT: ret %swift.opaque* [[T0]]
// The default memcpy-ing witness is good enough for NoWeak.
// CHECK-NOT: define linkonce_odr hidden %swift.opaque* @_TwtkV20weak_value_witnesses6NoWeak(%swift.opaque* %dest, %swift.opaque* %src, %swift.type* %Self)
// CHECK-NOT: @_TwTKV20weak_value_witnesses6NoWeak
// Weak references must be taken by swift_weakTakeInit.
// CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @_TwtkV20weak_value_witnesses8SomeWeak(%swift.opaque* %dest, %swift.opaque* %src, %swift.type* %SomeWeak)
// CHECK: call void @swift_weakTakeInit
// CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @_TwTKV20weak_value_witnesses8SomeWeak(
// CHECK: [[DEST:%.*]] = bitcast [24 x i8]* %dest to %V20weak_value_witnesses8SomeWeak*
// CHECK-NEXT: [[SRC:%.*]] = bitcast [24 x i8]* %src to %V20weak_value_witnesses8SomeWeak*
// CHECK-NEXT: [[DEST_X:%.*]] = getelementptr inbounds %V20weak_value_witnesses8SomeWeak, %V20weak_value_witnesses8SomeWeak* [[DEST]], i32 0, i32 0
// CHECK-NEXT: [[SRC_X:%.*]] = getelementptr inbounds %V20weak_value_witnesses8SomeWeak, %V20weak_value_witnesses8SomeWeak* [[SRC]], i32 0, i32 0
// CHECK-NEXT: [[T0:%.*]] = load %C20weak_value_witnesses1C*, %C20weak_value_witnesses1C** [[SRC_X]], align 8
// CHECK-NEXT: store %C20weak_value_witnesses1C* [[T0]], %C20weak_value_witnesses1C** [[DEST_X]], align 8
// CHECK-NEXT: [[DEST_Y:%.*]] = getelementptr inbounds %V20weak_value_witnesses8SomeWeak, %V20weak_value_witnesses8SomeWeak* [[DEST]], i32 0, i32 1
// CHECK-NEXT: [[SRC_Y:%.*]] = getelementptr inbounds %V20weak_value_witnesses8SomeWeak, %V20weak_value_witnesses8SomeWeak* [[SRC]], i32 0, i32 1
// CHECK-NEXT: call void @swift_weakTakeInit(%swift.weak* [[DEST_Y]], %swift.weak* [[SRC_Y]])
// CHECK-NEXT: [[T0:%.*]] = bitcast %V20weak_value_witnesses8SomeWeak* [[DEST]] to %swift.opaque*
// CHECK-NEXT: ret %swift.opaque* [[T0]]
// Generic types must be taken using their value witness.
// CHECK-LABEL: define linkonce_odr hidden %swift.opaque* @_TwtkV20weak_value_witnesses3Gen(%swift.opaque* %dest, %swift.opaque* %src, %swift.type* %"Gen<T>")
// CHECK: call %swift.opaque* %initializeWithTake