| // 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 |