blob: d604d48590afee81769f176003dccf2133ba0d03 [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-NOT: define internal %swift.opaque* @"$s20weak_value_witnesses8JustWeakVwTK"(
// The default memcpy-ing witness is good enough for NoWeak.
// CHECK-NOT: define internal %swift.opaque* @"$s20weak_value_witnesses6NoWeakVwtk"(%swift.opaque* %dest, %swift.opaque* %src, %swift.type* %Self)
// CHECK-NOT: @"$s20weak_value_witnesses6NoWeakVwTK"
// CHECK-LABEL: define internal %swift.opaque* @"$s20weak_value_witnesses8JustWeakVwCP"
// CHECK: entry:
// CHECK: load %swift.refcounted*, %swift.refcounted**
// CHECK: call %swift.refcounted* @swift_retain
// CHECK: store %swift.refcounted*
// CHECK: load %swift.refcounted*
// CHECK: getelementptr inbounds i8
// CHECK: ret %swift.opaque
// CHECK:}
// CHECK-LABEL: define internal %swift.opaque* @"$s20weak_value_witnesses8SomeWeakVwCP"
// CHECK:entry:
// CHECK: load %swift.refcounted*, %swift.refcounted**
// CHECK: call %swift.refcounted* @swift_retain
// CHECK: store %swift.refcounted*
// CHECK: load %swift.refcounted*
// CHECK: getelementptr inbounds i8
// CHECK: ret %swift.opaque
// CHECK:}
// Weak references must be taken by swift_weakTakeInit.
// CHECK-LABEL: define internal %swift.opaque* @"$s20weak_value_witnesses8SomeWeakVwtk"(%swift.opaque* noalias %dest, %swift.opaque* noalias %src, %swift.type* %SomeWeak)
// CHECK: call %swift.weak* @swift_weakTakeInit
// CHECK-NOT: define internal %swift.opaque* @"$s20weak_value_witnesses8SomeWeakVwTK"(
// Generic types must be taken using their value witness.
// CHECK-LABEL: define internal %swift.opaque* @"$s20weak_value_witnesses3GenVwtk"(%swift.opaque* noalias %dest, %swift.opaque* noalias %src, %swift.type* %"Gen<T>")
// CHECK: call %swift.opaque* %initializeWithTake