
// REQUIRES: no_asan
// RUN: %empty-directory(%t)
// RUN: %target-build-swift %s -emit-module -emit-library -module-name capture_descriptors -o %t/capture_descriptors.%target-dylib-extension
// RUN: %target-swift-reflection-dump -binary-filename %t/capture_descriptors.%target-dylib-extension | %FileCheck %s

sil_stage canonical

import Builtin
import Swift
import SwiftShims

// CHECK:      CAPTURE DESCRIPTORS:
// CHECK-NEXT: ====================

// Concrete caller and callee -- nothing interesting going on

protocol P {}
extension Int: P {}

sil @concrete_callee1 : $@convention(thin) (Int, @owned <τ_0_0> { var τ_0_0 } <Int>, @thin Int.Type, @thick P.Type) -> () {
bb0(%i : @trivial $Int, %b : @owned $<τ_0_0> { var τ_0_0 } <Int>, %m : @trivial $@thin Int.Type, %p : @trivial $@thick P.Type):
  %12 = tuple ()
  return %12 : $()
}

sil @concrete_caller1 : $@convention(thin) (Int, @thick P.Type) -> @owned @callee_guaranteed () -> () {
bb0(%i : @trivial $Int, %p : @trivial $@thick P.Type):
  %f = function_ref @concrete_callee1 : $@convention(thin) (Int, @owned <τ_0_0> { var τ_0_0 } <Int>, @thin Int.Type, @thick P.Type) -> ()
  %b = alloc_box $<τ_0_0> { var τ_0_0 } <Int>
  %m = metatype $@thin Int.Type
  %c = partial_apply [callee_guaranteed] %f(%i, %b, %m, %p) : $@convention(thin) (Int, @owned <τ_0_0> { var τ_0_0 } <Int>, @thin Int.Type, @thick P.Type) -> ()
  return %c : $@callee_guaranteed () -> ()
}

// This is the descriptor for '<τ_0_0> { var τ_0_0 } <Int>' above

// CHECK:      - Capture types:
// CHECK-NEXT: (struct Swift.Int)
// CHECK-NEXT: - Metadata sources:

// CHECK:      - Capture types:
// CHECK-NEXT: (struct Swift.Int)
// CHECK-NEXT: (builtin Builtin.NativeObject)
// CHECK-NEXT: (existential_metatype
// CHECK-NEXT:   (protocol_composition
// CHECK-NEXT:     (protocol capture_descriptors.P)))
// CHECK-NEXT: - Metadata sources:


// Concrete caller and generic callee -- capture types are fully substituted,
// and there are no metadata bindings

sil @generic_callee2 : $@convention(thin) <T, U> (@in T, @owned <τ_0_0> { var τ_0_0 } <U>) -> () {
bb0(%i : @trivial $*T, %b : @owned $<τ_0_0> { var τ_0_0 } <U>):
  %12 = tuple ()
  return %12 : $()
}

sil @concrete_caller2 : $@convention(thin) () -> @owned @callee_guaranteed () -> () {
bb0:
  %f = function_ref @generic_callee2 : $@convention(thin) <T, U> (@in T, @owned <τ_0_0> { var τ_0_0 } <U>) -> ()
  %i = alloc_stack $Int
  %b = alloc_box $<τ_0_0> { var τ_0_0 } <String>
  %c = partial_apply [callee_guaranteed] %f<Int, String>(%i, %b) : $@convention(thin) <T, U> (@in T, @owned <τ_0_0> { var τ_0_0 } <U>) -> ()
  dealloc_stack %i : $*Int
  return %c : $@callee_guaranteed () -> ()
}

// This is the descriptor for '<τ_0_0> { var τ_0_0 } <String>' above

// CHECK:      - Capture types:
// CHECK-NEXT: (struct Swift.String)
// CHECK-NEXT: - Metadata sources:

// CHECK:      - Capture types:
// CHECK-NEXT: (struct Swift.Int)
// CHECK-NEXT: (builtin Builtin.NativeObject)
// CHECK-NEXT:   - Metadata sources:


// Generic caller and generic callee -- capture types are written in terms of
// the caller's generic parameters, and metadata bindings are present for
// structural sub-terms of the callee's substituted generic parameters that
// contain the caller's generic parameters.

sil @generic_callee3 : $@convention(thin) <T, U> (@in_guaranteed T) -> () {
bb0(%t : @trivial $*T):
  %12 = tuple ()
  return %12 : $()
}

sil @generic_caller3 : $@convention(thin) <A, B, C> () -> @owned @callee_guaranteed () -> () {
bb0:
  %f = function_ref @generic_callee3 : $@convention(thin) <T, U> (@in_guaranteed T) -> ()
  %t = alloc_stack $Optional<@callee_guaranteed (@in_guaranteed A) -> @out B>
  %c = partial_apply [callee_guaranteed] %f<Optional<(A) -> B>, (B, (C) -> Int)>(%t) : $@convention(thin) <T, U> (@in_guaranteed T) -> ()
  dealloc_stack %t : $*Optional<@callee_guaranteed (@in_guaranteed A) -> @out B>
  return %c : $@callee_guaranteed () -> ()
}

// CHECK:      - Capture types:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT:   (function
// CHECK-NEXT:     (parameters)
// CHECK-NEXT:     (result
// CHECK-NEXT:       (tuple)))
// CHECK-NEXT: - Metadata sources:
// CHECK-NEXT: (bound_generic_enum Swift.Optional
// CHECK-NEXT:   (function
// CHECK-NEXT:     (parameters
// CHECK-NEXT:       (generic_type_parameter depth=0 index=0)
// CHECK-NEXT:     (result
// CHECK-NEXT:       (generic_type_parameter depth=0 index=1)))
// CHECK-NEXT: (closure_binding index=0)
// CHECK-NEXT: (generic_type_parameter depth=0 index=1)
// CHECK-NEXT: (closure_binding index=1)
// CHECK-NEXT: (generic_type_parameter depth=0 index=2)
// CHECK-NEXT: (closure_binding index=2)


// Generic caller and generic callee -- and one of the type parameters is
// fulfilled by a thick metatype value.

sil @generic_callee4 : $@convention(thin) <T, U> (@thick Optional<T>.Type) -> () {
bb0(%t : @trivial $@thick Optional<T>.Type):
  %12 = tuple ()
  return %12 : $()
}

sil @generic_caller4 : $@convention(thin) <A, B, C> () -> @owned @callee_guaranteed () -> () {
bb0:
  %f = function_ref @generic_callee4 : $@convention(thin) <T, U> (@thick Optional<T>.Type) -> ()
  %t = metatype $@thick Optional<(B) -> C>.Type
  %c = partial_apply [callee_guaranteed] %f<(B) -> C, Int>(%t) : $@convention(thin) <T, U> (@thick Optional<T>.Type) -> ()
  return %c : $@callee_guaranteed () -> ()
}

// CHECK:      - Capture types:
// CHECK-NEXT: (metatype was_abstract
// CHECK-NEXT:  (bound_generic_enum Swift.Optional
// CHECK-NEXT:    (function
// CHECK-NEXT:      (parameters
// CHECK-NEXT:        (generic_type_parameter depth=0 index=1)
// CHECK-NEXT:      (result
// CHECK-NEXT:        (generic_type_parameter depth=0 index=2))))
// CHECK-NEXT: - Metadata sources:
// CHECK-NEXT: (function
// CHECK-NEXT:   (parameters
// CHECK-NEXT:     (generic_type_parameter depth=0 index=1)
// CHECK-NEXT:   (result
// CHECK-NEXT:     (generic_type_parameter depth=0 index=2))
// CHECK-NEXT: (generic_argument index=0
// CHECK-NEXT:   (metadata_capture index=0))


// Generic caller and generic callee -- and one of the type parameters is
// fulfilled by the isa pointer of a class instance.

class GenericClass<T, U> {}

sil @generic_callee5 : $@convention(thin) <T, U, V> (@owned GenericClass<T, U>) -> () {
bb0(%t : @owned $GenericClass<T, U>):
  %12 = tuple ()
  return %12 : $()
}

sil @generic_caller5 : $@convention(thin) <A, B, C> (@owned GenericClass<(A, B), (B, C)>) -> @owned @callee_guaranteed () -> () {
bb0(%g : @owned $GenericClass<(A, B), (B, C)>):
  %f = function_ref @generic_callee5 : $@convention(thin) <T, U, V> (@owned GenericClass<T, U>) -> ()
  %c = partial_apply [callee_guaranteed] %f<(A, B), (B, C), (C, A)>(%g) : $@convention(thin) <T, U, V> (@owned GenericClass<T, U>) -> ()
  return %c : $@callee_guaranteed () -> ()
}

sil_vtable GenericClass {}

// CHECK:      - Capture types:
// CHECK-NEXT: (bound_generic_class capture_descriptors.GenericClass
// CHECK-NEXT:   (tuple
// CHECK-NEXT:     (generic_type_parameter depth=0 index=0)
// CHECK-NEXT:     (generic_type_parameter depth=0 index=1))
// CHECK-NEXT:   (tuple
// CHECK-NEXT:     (generic_type_parameter depth=0 index=1)
// CHECK-NEXT:     (generic_type_parameter depth=0 index=2)))
// CHECK-NEXT: - Metadata sources:
// CHECK-NEXT: (generic_type_parameter depth=0 index=2)
// CHECK-NEXT: (closure_binding index=0)
// CHECK-NEXT: (generic_type_parameter depth=0 index=0)
// CHECK-NEXT: (closure_binding index=1)
// CHECK-NEXT: (tuple
// CHECK-NEXT:   (generic_type_parameter depth=0 index=0)
// CHECK-NEXT:   (generic_type_parameter depth=0 index=1))
// CHECK-NEXT: (generic_argument index=0
// CHECK-NEXT:   (reference_capture index=0))
// CHECK-NEXT: (tuple
// CHECK-NEXT:   (generic_type_parameter depth=0 index=1)
// CHECK-NEXT:   (generic_type_parameter depth=0 index=2))
// CHECK-NEXT: (generic_argument index=1
// CHECK-NEXT:   (reference_capture index=0))


// Pseudogeneric caller and pseudogeneric callee -- type parameters are
// erased at runtime.

sil @pseudogeneric_callee : $@convention(thin) @pseudogeneric <T : AnyObject, U : AnyObject> (@owned T, @owned U) -> () {
bb0(%t : @owned $T, %u : @owned $U):
  %12 = tuple ()
  return %12 : $()
}

sil @pseudogeneric_caller : $@convention(thin) @pseudogeneric <A : AnyObject, B : AnyObject, C : AnyObject> (@owned A, @owned B) -> @owned @callee_guaranteed () -> () {
bb0(%a : @owned $A, %b : @owned $B):
  %f = function_ref @pseudogeneric_callee : $@convention(thin) @pseudogeneric <T : AnyObject, U : AnyObject> (@owned T, @owned U) -> ()
  %c = partial_apply [callee_guaranteed] %f<A, B>(%a, %b) : $@convention(thin) @pseudogeneric <A : AnyObject, B : AnyObject> (@owned A, @owned B) -> ()
  return %c : $@callee_guaranteed () -> ()
}

// CHECK:      - Capture types:
// CHECK-NEXT:   (protocol_composition any_object)
// CHECK-NEXT:   (protocol_composition any_object)
// CHECK-NEXT: - Metadata sources:


// Capturing lowered function types

sil @function_callee : $@convention(thin) (@convention(thin) () -> (), @convention(c) () -> (), @convention(block) () -> (), @convention(thick) () -> (), @convention(method) () -> (), @convention(witness_method: P) (Int) -> ()) -> () {
bb0(%thin : @trivial $@convention(thin) () -> (), %c : @trivial $@convention(c) () -> (), %block : @unowned $@convention(block) () -> (), %thick : @unowned $@convention(thick) () -> (), %method : @trivial $@convention(method) () -> (), %witness_method : @trivial $@convention(witness_method: P) (Int) -> ()):
  %12 = tuple ()
  return %12 : $()
}

sil @function_caller : $@convention(thin) (@convention(thin) () -> (), @convention(c) () -> (), @convention(block) () -> (), @convention(thick) () -> (), @convention(method) () -> (), @convention(witness_method: P) (Int) -> ()) -> @owned @callee_guaranteed () -> () {
bb0(%thin: @trivial $@convention(thin) () -> (), %c: @trivial $@convention(c) () -> (), %block: @unowned $@convention(block) () -> (), %thick: @unowned $@convention(thick) () -> (), %method: @trivial $@convention(method) () -> (), %witness_method: @trivial $@convention(witness_method: P) (Int) -> ()):
  %f = function_ref @function_callee : $@convention(thin) (@convention(thin) () -> (), @convention(c) () -> (), @convention(block) () -> (), @convention(thick) () -> (), @convention(method) () -> (), @convention(witness_method: P) (Int) -> ()) -> ()
  %result = partial_apply [callee_guaranteed] %f(%thin, %c, %block, %thick, %method, %witness_method) : $@convention(thin) (@convention(thin) () -> (), @convention(c) () -> (), @convention(block) () -> (), @convention(thick) () -> (), @convention(method) () -> (), @convention(witness_method: P) (Int) -> ()) -> ()
  return %result : $@callee_guaranteed () -> ()
}

// CHECK:      - Capture types:
// CHECK-NEXT: (function convention=thin
// CHECK-NEXT:   (parameters)
// CHECK-NEXT:   (result
// CHECK-NEXT:     (tuple))
// CHECK-NEXT: (function convention=c
// CHECK-NEXT:   (parameters)
// CHECK-NEXT:   (result
// CHECK-NEXT:     (tuple))
// CHECK-NEXT: (function convention=block
// CHECK-NEXT:   (parameters)
// CHECK-NEXT:   (result
// CHECK-NEXT:     (tuple))
// CHECK-NEXT: (function
// CHECK-NEXT:   (parameters)
// CHECK-NEXT:   (result
// CHECK-NEXT:     (tuple))
// CHECK-NEXT: (function convention=thin
// CHECK-NEXT:   (parameters)
// CHECK-NEXT:   (result
// CHECK-NEXT:     (tuple))
// CHECK-NEXT: (function convention=thin
// CHECK-NEXT:   (parameters)
// CHECK-NEXT:   (result
// CHECK-NEXT:     (tuple))
// CHECK-NEXT: - Metadata sources:

// Capturing opened existentials
//
// Not supported yet -- make sure we bail out instead of crashing.
//
// FIXME: Eventually, we should emit a useful capture descriptor
// for this case.

sil @existential_callee : $@convention(thin) <τ_0_0 where τ_0_0 : P> () -> @out P {
bb0(%0 : @trivial $*P):
  unreachable
}


sil @existential_caller : $@convention(thin) (@in P) -> () {
bb0(%0 : @trivial $*P):
  %payload = open_existential_addr immutable_access %0 : $*P to $*@opened("2D7A8F84-2973-11E7-838D-34363BD08DA0") P
  %f = function_ref @existential_callee : $@convention(thin) <τ_0_0 where τ_0_0 : P> () -> @out P
  %result = partial_apply [callee_guaranteed] %f<@opened("2D7A8F84-2973-11E7-838D-34363BD08DA0") P>() : $@convention(thin) <τ_0_0 where τ_0_0 : P> () -> @out P
  destroy_value %result : $@callee_guaranteed () -> @out P
  destroy_addr %0 : $*P
  %tuple = tuple ()
  return %tuple : $()
}
