// RUN: %target-swift-frontend -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>) -> ()
}
