| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all %s -sil-combine -remove-runtime-asserts | %FileCheck %s |
| |
| sil_stage canonical |
| |
| import Builtin |
| import Swift |
| |
| class RawBuffer {} |
| class HeapBufferStorage<T, U> : RawBuffer {} |
| |
| class C { |
| } |
| class D : C { |
| } |
| class E { |
| } |
| |
| // CHECK-LABEL: sil @test_unconditional_checked_cast |
| // CHECK: bb0 |
| // CHECK-NEXT: unchecked_ref_cast |
| // CHECK-NEXT: return |
| sil @test_unconditional_checked_cast : $@convention(thin) <T_0_0, T_0_1> (RawBuffer) -> HeapBufferStorage<T_0_0, T_0_1> { |
| bb0(%0 : $RawBuffer): |
| %3 = unconditional_checked_cast %0 : $RawBuffer to $HeapBufferStorage<T_0_0, T_0_1> |
| return %3 : $HeapBufferStorage<T_0_0, T_0_1> |
| } |
| |
| // CHECK-LABEL: sil @test_cond_fail |
| // CHECK: bb0 |
| // CHECK-NEXT: tuple () |
| // CHECK-NEXT: return |
| sil @test_cond_fail : $@convention(thin) (Builtin.Int1) -> () { |
| bb0(%0 : $Builtin.Int1): |
| cond_fail %0 : $Builtin.Int1 |
| %2 = tuple () |
| return %2 : $() |
| } |
| |
| // CHECK-LABEL: sil @test_unconditional_checked_cast_addr_fail |
| // CHECK: bb0 |
| // CHECK-NEXT: store undef |
| // CHECK-NEXT: builtin "int_trap" |
| // CHECK: unreachable |
| // CHECK: } |
| sil @test_unconditional_checked_cast_addr_fail : $@convention(thin) (@in E, @in D) -> @out D { |
| bb0(%0 : $*D, %1 : $*E, %2 : $*D): |
| unconditional_checked_cast_addr E in %1 : $*E to D in %0 : $*D |
| %4 = load %2 : $*D |
| strong_release %4 : $D |
| %6 = tuple () |
| return %6 : $() |
| } |
| |
| // CHECK-LABEL: sil @test_unconditional_checked_cast_other_use |
| // CHECK: bb0([[ARG:%.*]] : $C |
| // CHECK-NOT: unconditional_checked_cast |
| // CHECK: return [[ARG]] |
| |
| sil @test_unconditional_checked_cast_other_use : $@convention(thin) (@owned C) -> @owned C { |
| bb0(%0 : $C): |
| strong_retain %0 : $C |
| %3 = unconditional_checked_cast %0 : $C to $C |
| strong_release %0 : $C |
| return %3 : $C |
| } |
| |
| protocol Class : class { |
| } |
| |
| class G : Class { |
| } |
| |
| // CHECK-LABEL: sil @test_unconditional_checked_cast_class_exist |
| // CHECK: unchecked_ref_cast |
| // CHECK: return |
| sil @test_unconditional_checked_cast_class_exist : $@convention(thin) (@owned Class) -> @owned G { |
| bb0(%0 : $Class): |
| strong_retain %0 : $Class |
| %2 = unconditional_checked_cast %0 : $Class to $G |
| strong_release %0 : $Class |
| return %2 : $G |
| } |