// RUN: %target-sil-opt -enable-sil-verify-all -inline %s | %FileCheck %s // Check if cloning of init_existential_* works correctly with multiple // conformances. sil_stage canonical import Builtin typealias AnyObject = Builtin.AnyObject protocol ClassProto1 : class { } protocol ClassProto2 : class { } class MyClass : ClassProto1, ClassProto2 { } protocol Proto1 { } protocol Proto2 { } class MyClass2 : Proto1, Proto2 { } // CHECK-LABEL: sil @test_ref sil @test_ref : $@convention(thin) (@guaranteed MyClass) -> () { bb0(%0 : $MyClass): %6 = init_existential_ref %0 : $MyClass : $MyClass, $ClassProto1 & ClassProto2 %11 = tuple () return %11 : $() } // CHECK-LABEL: sil @call_test_ref // CHECK: init_existential_ref sil @call_test_ref : $@convention(thin) (@guaranteed MyClass) -> () { bb0(%0 : $MyClass): %1 = function_ref @test_ref : $@convention(thin) (@guaranteed MyClass) -> () %3 = apply %1(%0) : $@convention(thin) (@guaranteed MyClass) -> () return %3 : $() } // CHECK-LABEL: sil @test_addr sil @test_addr : $@convention(thin) (@guaranteed MyClass2) -> @out Proto1 & Proto2 { bb0(%0 : $*Proto1 & Proto2, %1 : $MyClass2): %3 = init_existential_addr %0 : $*Proto1 & Proto2, $MyClass2 store %1 to %3 : $*MyClass2 %5 = tuple () return %5 : $() } // CHECK-LABEL: sil @call_test_addr // CHECK: init_existential_addr sil @call_test_addr : $@convention(thin) (@guaranteed MyClass2) -> @out Proto1 & Proto2 { bb0(%0 : $*Proto1 & Proto2, %1 : $MyClass2): %3 = function_ref @test_addr : $@convention(thin) (@guaranteed MyClass2) -> @out Proto1 & Proto2 %5 = apply %3(%0, %1) : $@convention(thin) (@guaranteed MyClass2) -> @out Proto1 & Proto2 %7 = tuple () return %7 : $() }