Revision a87ef76f85c8c42fa15329ea53adda4793bf9686 authored by Mishal Shah on 27 August 2019, 23:26:43 UTC, committed by GitHub on 27 August 2019, 23:26:43 UTC
2 parent s 148ea44 + 4d66676
Raw File
clone_init_existential.sil
// RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -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 : $()
}

back to top