
// RUN: %target-swift-frontend -enable-sil-ownership -emit-sil -O -Xllvm -sil-fso-enable-generics=false %s | %FileCheck %s

sil_stage raw

import Builtin

typealias Int = Builtin.Int32

// rdar://problem/28945854: When a nongeneric closure was formed inside a
// generic function, the capture promotion pass would erroneously try to
// apply the generic caller's substitutions to the nongeneric callee, violating
// invariants.

// CHECK-LABEL: sil @$s14promotable_boxTf2i_n : $@convention(thin) (Builtin.Int32) -> Builtin.Int32
sil [ossa] @promotable_box : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Int>) -> Int {
entry(%b : @owned $<τ_0_0> { var τ_0_0 } <Int>):
  %a = project_box %b : $<τ_0_0> { var τ_0_0 } <Int>, 0
  %v = load [trivial] %a : $*Int
  destroy_value %b : $<τ_0_0> { var τ_0_0 } <Int>
  return %v : $Int
}

// CHECK-LABEL: sil {{.*}}@call_promotable_box_from_generic
// CHECK:         [[F:%.*]] = function_ref @$s14promotable_boxTf2i_n
// CHECK:         partial_apply [callee_guaranteed] [[F]](

sil [ossa] @call_promotable_box_from_generic : $@convention(thin) <T> (@in T, Int) -> @owned @callee_guaranteed () -> Int {
entry(%0 : $*T, %1 : $Int):
  destroy_addr %0 : $*T
  %f = function_ref @promotable_box : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Int>) -> Int
  %b = alloc_box $<τ_0_0> { var τ_0_0 } <Int>
  %a = project_box %b : $<τ_0_0> { var τ_0_0 } <Int>, 0
  store %1 to [trivial] %a : $*Int
  %k = partial_apply [callee_guaranteed] %f(%b) : $@convention(thin) (@owned <τ_0_0> { var τ_0_0 } <Int>) -> Int
  return %k : $@callee_guaranteed () -> Int
}

protocol P {}

// CHECK-LABEL: sil @$s22generic_promotable_boxTf2ni_n : $@convention(thin) <T> (@in T, Builtin.Int32) -> Builtin.Int32
// CHECK:       bb0([[ARG0:%.*]] : $*T, [[ARG1:%.*]] : $Builtin.Int32):
// CHECK-NEXT:    return [[ARG1]] : $Builtin.Int32

sil [ossa] @generic_promotable_box : $@convention(thin) <T> (@in T, @owned <τ_0_0> { var τ_0_0 } <Int>) -> Int {
entry(%0 : $*T, %b : @owned $<τ_0_0> { var τ_0_0 } <Int>):
  %a = project_box %b : $<τ_0_0> { var τ_0_0 } <Int>, 0
  %v = load [trivial] %a : $*Int
  destroy_value %b : $<τ_0_0> { var τ_0_0 } <Int>
  return %v : $Int
}

// CHECK-LABEL: sil @call_generic_promotable_box_from_different_generic
// CHECK:       bb0([[ARG0:%.*]] : $*T, [[ARG1:%.*]] : $*U, [[ARG2:%.*]] : $Builtin.Int32):
// CHECK-NEXT:    destroy_addr [[ARG0]] : $*T
// CHECK-NEXT:    destroy_addr [[ARG1]] : $*U
// CHECK:         [[F:%.*]] = function_ref @$s22generic_promotable_boxTf2ni_n : $@convention(thin) <τ_0_0> (@in τ_0_0, Builtin.Int32) -> Builtin.Int32
// CHECK-NEXT:    [[CLOSURE:%.*]] = partial_apply [callee_guaranteed] [[F]]<U>([[ARG2]])
// CHECK-NEXT:    return [[CLOSURE]]

sil [ossa] @call_generic_promotable_box_from_different_generic : $@convention(thin) <T, U: P> (@in T, @in U, Int) -> @owned @callee_guaranteed (@in U) -> Int {
entry(%0 : $*T, %1 : $*U, %2 : $Int):
  destroy_addr %0 : $*T
  destroy_addr %1 : $*U
  %f = function_ref @generic_promotable_box : $@convention(thin) <V> (@in V, @owned <τ_0_0> { var τ_0_0 } <Int>) -> Int
  %b = alloc_box $<τ_0_0> { var τ_0_0 } <Int>
  %a = project_box %b : $<τ_0_0> { var τ_0_0 } <Int>, 0
  store %2 to [trivial] %a : $*Int
  %k = partial_apply [callee_guaranteed] %f<U>(%b) : $@convention(thin) <V> (@in V, @owned <τ_0_0> { var τ_0_0 } <Int>) -> Int
  return %k : $@callee_guaranteed (@in U) -> Int
}

enum E<X> {
  case None
  case Some(X)
}

struct R<T> {
}

// Check that the capture promotion took place and the function now
// take argument of a type E<(R<T>) -> Builtin.Int32>, which used
// to be a slot inside a box.
// CHECK-LABEL: sil @$s23generic_promotable_box2Tf2nni_n : $@convention(thin) <T> (@in R<T>, @in Builtin.Int32, @owned E<(R<T>) -> Builtin.Int32>) -> () 
// CHECK:       bb0([[ARG0:%.*]] : $*R<T>, [[ARG1:%.*]] : $*Builtin.Int32, [[ARG2:%.*]] : $E<(R<T>) -> Builtin.Int32>):
// CHECK-NOT:     project_box
// CHECK:         switch_enum [[ARG2]] : $E<(R<T>) -> Builtin.Int32>
// CHECK-NOT:     project_box
// CHECK:       } // end sil function '$s23generic_promotable_box2Tf2nni_n'
sil [ossa] @generic_promotable_box2 : $@convention(thin) <T> (@in R<T>, @in Int, @owned <τ_0_0> { var E<(R<τ_0_0>) -> Int> } <T>) -> () {
entry(%0 : $*R<T>, %1 : $*Int, %b : @owned $<τ_0_0> { var E<(R<τ_0_0>)->Int> } <T>):
  %a = project_box %b : $<τ_0_0> { var E<(R<τ_0_0>)->Int> } <T>, 0
  %e = load [copy] %a : $*E<(R<T>)->Int>
  switch_enum %e : $E<(R<T>)->Int>, case #E.Some!enumelt.1 : bb1, default bb2

bb1(%f : @owned $@callee_guaranteed (@in_guaranteed R<T>) -> @out Int):
  %bf = begin_borrow %f : $@callee_guaranteed (@in_guaranteed R<T>) -> @out Int
  apply %bf(%1, %0) : $@callee_guaranteed (@in_guaranteed R<T>) -> @out Int
  end_borrow %bf : $@callee_guaranteed (@in_guaranteed R<T>) -> @out Int 
  destroy_value %f : $@callee_guaranteed (@in_guaranteed R<T>) -> @out Int
  br exit

bb2(%original : @owned $E<(R<T>)->Int>):
  destroy_value %original : $E<(R<T>)->Int>
  br exit

exit:
  destroy_value %b : $<τ_0_0> { var E<(R<τ_0_0>)->Int> } <T>
  %r = tuple ()
  return %r : $()
}

// Check that alloc_box was eliminated and a specialized version of the
// closure is invoked.
// CHECK-LABEL: sil @call_generic_promotable_box_from_different_generic2
// CHECK:       bb0([[ARG0:%.*]] : $*R<T>, [[ARG1:%.*]] : $*E<(R<U>) -> Builtin.Int32>, [[ARG2:%.*]] : $*Builtin.Int32):
// CHECK:         %3 = load [[ARG1]] : $*E<(R<U>) -> Builtin.Int32>
// CHECK:         [[F:%.*]] = function_ref @$s23generic_promotable_box2Tf2nni_n : $@convention(thin) <τ_0_0> (@in R<τ_0_0>, @in Builtin.Int32, @owned E<(R<τ_0_0>) -> Builtin.Int32>) -> ()
// CHECK-NEXT:    [[CLOSURE:%.*]] = partial_apply [callee_guaranteed] [[F]]<U>(%2, %3)
// CHECK-NEXT:    return [[CLOSURE]]

sil [ossa] @call_generic_promotable_box_from_different_generic2 : $@convention(thin) <T, U: P> (@in R<T>, @in E<(R<U>)->Int>, @in Int) -> @owned @callee_guaranteed (@in R<U>) -> () {
entry(%0 : $*R<T>, %1 : $*E<(R<U>)->Int>, %2 : $*Int):
  destroy_addr %0 : $*R<T>
  %f = function_ref @generic_promotable_box2 : $@convention(thin) <V> (@in R<V>, @in Int, @owned <τ_0_0> { var E<(R<τ_0_0>)->Int> } <V>) -> ()
  %b = alloc_box $<τ_0_0> { var E<(R<τ_0_0>)->Int> } <U>
  %a = project_box %b : $<τ_0_0> { var E<(R<τ_0_0>)->Int> } <U>, 0
  copy_addr [take] %1 to [initialization] %a : $*E<(R<U>)->Int>
  %k = partial_apply [callee_guaranteed] %f<U>(%2, %b) : $@convention(thin) <V> (@in R<V>, @in Int, @owned <τ_0_0> { var E<(R<τ_0_0>)->Int> } <V>) -> ()
  return %k : $@callee_guaranteed (@in R<U>) -> ()
}
