|
7 | 7 | import Swift
|
8 | 8 | import Foundation
|
9 | 9 |
|
| 10 | +class SwiftClass {} |
| 11 | +sil_vtable SwiftClass {} |
| 12 | + |
| 13 | +protocol ClassProto : class {} |
| 14 | + |
10 | 15 | // CHECK-LABEL: define hidden swiftcc %TSo8NSObjectC* @checkedClassBoundCast(%swift.type*, %TSo8NSObjectC*, %swift.type* %T) #0 {
|
11 | 16 | // CHECK: [[OPAQUE_OBJ:%.+]] = bitcast %TSo8NSObjectC* %1 to i8*
|
12 | 17 | // CHECK: [[OPAQUE_CLASS:%.+]] = bitcast %swift.type* %T to i8*
|
@@ -54,3 +59,27 @@ bb0(%metatype : $Optional<@thick T.Type>):
|
54 | 59 | %tuple = tuple ()
|
55 | 60 | return %tuple : $()
|
56 | 61 | }
|
| 62 | + |
| 63 | +// CHECK-LABEL: define hidden swiftcc { %objc_object*, i8** } @swift_class_bounded_to_cp |
| 64 | +// CHECK-SAME: ([[SWIFTCLASS:%T10objc_casts10SwiftClassC]]*, %swift.type* %T) |
| 65 | +// CHECK: [[T0:%.*]] = bitcast [[SWIFTCLASS]]* %0 to %swift.type** |
| 66 | +// CHECK-NEXT: [[TYPE:%.*]] = load %swift.type*, %swift.type** [[T0]], |
| 67 | +// CHECK-NEXT: [[T0:%.*]] = bitcast [[SWIFTCLASS]]* %0 to i8* |
| 68 | +// CHECK-NEXT: call { i8*, i8** } @dynamic_cast_existential_1_unconditional(i8* [[T0]], %swift.type* [[TYPE]], %swift.protocol* @"$S10objc_casts10ClassProtoMp") |
| 69 | +sil hidden @swift_class_bounded_to_cp : $@convention(thin) <T: SwiftClass> (@owned T) -> @owned ClassProto { |
| 70 | +entry(%a : $T): |
| 71 | + %0 = unconditional_checked_cast %a : $T to $ClassProto |
| 72 | + return %0 : $ClassProto |
| 73 | +} |
| 74 | + |
| 75 | +// CHECK-LABEL: define hidden swiftcc { %objc_object*, i8** } @objc_class_bounded_to_cp |
| 76 | +// CHECK-SAME: ([[OBJCCLASS:%TSo8NSObjectC]]*, %swift.type* %T) |
| 77 | +// CHECK: [[T0:%.*]] = bitcast [[OBJCCLASS]]* %0 to %objc_object* |
| 78 | +// CHECK-NEXT: [[TYPE:%.*]] = call %swift.type* @swift_getObjectType(%objc_object* [[T0]]) |
| 79 | +// CHECK-NEXT: [[T0:%.*]] = bitcast [[OBJCCLASS]]* %0 to i8* |
| 80 | +// CHECK-NEXT: call { i8*, i8** } @dynamic_cast_existential_1_unconditional(i8* [[T0]], %swift.type* [[TYPE]], %swift.protocol* @"$S10objc_casts10ClassProtoMp") |
| 81 | +sil hidden @objc_class_bounded_to_cp : $@convention(thin) <T: NSObject> (@owned T) -> @owned ClassProto { |
| 82 | +entry(%a : $T): |
| 83 | + %0 = unconditional_checked_cast %a : $T to $ClassProto |
| 84 | + return %0 : $ClassProto |
| 85 | +} |
0 commit comments