// RUN: %target-sil-opt -module-name infer -test-runner %s 2>&1 | %FileCheck %s import Builtin //===----------------------------------------------------------------------===// // MARK: Declarations //===----------------------------------------------------------------------===// class Klass { } class ContainsKlass { var computedKlass: Klass { get } final var klass: Klass init() } struct KlassPair { var lhs: Klass var rhs: Klass } class KlassWithKlassPair { var ns1: KlassPair { get } var ns2: (KlassPair, KlassPair) { get } } sil @getKlass : $@convention(thin) () -> @owned Klass sil @getContainsKlass : $@convention(thin) () -> @owned ContainsKlass sil @useIndirect : $@convention(thin) (@in_guaranteed T) -> () sil @sideEffect : $@convention(thin) () -> () enum FakeOptional { case none case some(T) } enum FirstSecondEnum { case first case second(T) } enum FirstSecondThirdEnum { case first case second(T) case third(FakeOptional) } //===----------------------------------------------------------------------===// // MARK: Tests //===----------------------------------------------------------------------===// // CHECK-LABEL: begin running test {{[0-9]+}} of {{[0-9]+}} on simple_test_case: variable_name_inference with: @trace[0] // CHECK: Input Value: %1 = apply %0() : $@convention(thin) () -> @owned Klass // CHECK: Name: 'MyName' // CHECK: Root: %1 = apply %0() : $@convention(thin) () -> @owned Klass // CHECK: end running test {{[0-9]+}} of {{[0-9]+}} on simple_test_case: variable_name_inference with: @trace[0] sil [ossa] @simple_test_case : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %1 = apply %0() : $@convention(thin) () -> @owned Klass debug_value [trace] %1 : $Klass debug_value %1 : $Klass, let, name "MyName" destroy_value %1 : $Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test {{[0-9]+}} of {{[0-9]+}} on temporary_init_with_copy_addr: variable_name_inference with: @trace[0] // CHECK: Input Value: %4 = alloc_stack $Klass // CHECK: Name: 'MyName' // CHECK: Root: %2 = alloc_stack $Klass, var, name "MyName" // CHECK: end running test {{[0-9]+}} of {{[0-9]+}} on temporary_init_with_copy_addr: variable_name_inference with: @trace[0] sil [ossa] @temporary_init_with_copy_addr : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %1 = apply %0() : $@convention(thin) () -> @owned Klass %2 = alloc_stack $Klass, name "MyName" store %1 to [init] %2 : $*Klass %temp = alloc_stack $Klass copy_addr %2 to [init] %temp : $*Klass debug_value [trace] %temp : $*Klass %use = function_ref @useIndirect : $@convention(thin) (@in_guaranteed T) -> () apply %use(%temp) : $@convention(thin) (@in_guaranteed T) -> () destroy_addr %temp : $*Klass dealloc_stack %temp : $*Klass destroy_addr %2 : $*Klass dealloc_stack %2 : $*Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test {{[0-9]+}} of {{[0-9]+}} on temporary_init_with_store: variable_name_inference with: @trace[0] // CHECK: Input Value: %3 = alloc_stack $Klass // CHECK: Name: 'MyName' // CHECK: Root: %1 = apply %0() // CHECK: end running test {{[0-9]+}} of {{[0-9]+}} on temporary_init_with_store: variable_name_inference with: @trace[0] sil [ossa] @temporary_init_with_store : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %1 = apply %0() : $@convention(thin) () -> @owned Klass debug_value %1 : $Klass, name "MyName", let %temp = alloc_stack $Klass store %1 to [init] %temp : $*Klass debug_value [trace] %temp : $*Klass %use = function_ref @useIndirect : $@convention(thin) (@in_guaranteed T) -> () apply %use(%temp) : $@convention(thin) (@in_guaranteed T) -> () destroy_addr %temp : $*Klass dealloc_stack %temp : $*Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test {{.*}} of {{.*}} on look_through_accessors_get: variable_name_inference with: @trace[0] // CHECK: Name: 'myName.computedKlass' // CHECK: Root: %2 = move_value [lexical] [var_decl] // CHECK: end running test {{.*}} of {{.*}} on look_through_accessors_get: variable_name_inference with: @trace[0] sil [ossa] @look_through_accessors_get : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getContainsKlass : $@convention(thin) () -> @owned ContainsKlass %1 = apply %0() : $@convention(thin) () -> @owned ContainsKlass %3 = move_value [lexical] [var_decl] %1 : $ContainsKlass debug_value %3 : $ContainsKlass, let, name "myName" %5 = begin_borrow %3 : $ContainsKlass %6 = class_method %5 : $ContainsKlass, #ContainsKlass.computedKlass!getter : (ContainsKlass) -> () -> Klass, $@convention(method) (@guaranteed ContainsKlass) -> @owned Klass %7 = apply %6(%5) : $@convention(method) (@guaranteed ContainsKlass) -> @owned Klass debug_value [trace] %7 : $Klass end_borrow %5 : $ContainsKlass destroy_value %7 : $Klass destroy_value %3 : $ContainsKlass %13 = tuple () return %13 : $() } sil [thunk] @test_reabstraction_thunk : $@convention(thin) (@guaranteed @callee_guaranteed () -> ()) -> @out () // CHECK-LABEL: begin running test {{.*}} of {{.*}} on handle_function_conversion_reabstraction_thunks: variable_name_inference with: @trace[0] // CHECK: Name: 'namedClosure' // CHECK: Root: %0 = alloc_stack [lexical] $@callee_guaranteed () -> (), var, name "namedClosure" // CHECK: end running test {{.*}} of {{.*}} on handle_function_conversion_reabstraction_thunks: variable_name_inference with: @trace[0] sil [ossa] @handle_function_conversion_reabstraction_thunks : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %namedStack = alloc_stack [lexical] $@callee_guaranteed () -> (), var, name "namedClosure" %f = function_ref @sideEffect : $@convention(thin) () -> () %pa = partial_apply [callee_guaranteed] %f() : $@convention(thin) () -> () store %pa to [init] %namedStack : $*@callee_guaranteed () -> () %temp = alloc_stack $@callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <()> %access = begin_access [read] [static] %namedStack : $*@callee_guaranteed () -> () %load = load [copy] %access : $*@callee_guaranteed () -> () end_access %access : $*@callee_guaranteed () -> () %reabstract = function_ref @test_reabstraction_thunk : $@convention(thin) (@guaranteed @callee_guaranteed () -> ()) -> @out () %reabstract_partially_applied = partial_apply [callee_guaranteed] %reabstract(%load) : $@convention(thin) (@guaranteed @callee_guaranteed () -> ()) -> @out () %cvt = convert_function %reabstract_partially_applied : $@callee_guaranteed () -> @out () to $@callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <()> store %cvt to [init] %temp : $*@callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <()> debug_value [trace] %temp : $*@callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <()> destroy_addr %temp : $*@callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <()> dealloc_stack %temp : $*@callee_guaranteed @substituted <τ_0_0> () -> @out τ_0_0 for <()> destroy_addr %namedStack : $*@callee_guaranteed () -> () dealloc_stack %namedStack : $*@callee_guaranteed () -> () %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test {{.*}} of {{.*}} on mark_uninitialized_test: variable_name_inference with: @trace[0] // CHECK: Name: 'self' // CHECK: Root: %0 = alloc_stack $Klass, var, name "self" // CHECK: end running test {{.*}} of {{.*}} on mark_uninitialized_test: variable_name_inference with: @trace[0] sil [ossa] @mark_uninitialized_test : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %1 = alloc_stack $Klass, var, name "self" %2 = mark_uninitialized [rootself] %1 : $*Klass debug_value [trace] %2 : $*Klass dealloc_stack %1 : $*Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test {{.*}} of {{.*}} on copyable_to_moveonlywrapper_addr_test: variable_name_inference with: @trace[0] // CHECK: Name: 'self' // CHECK: Root: %0 = alloc_stack $Klass, var, name "self" // CHECK: end running test {{.*}} of {{.*}} on copyable_to_moveonlywrapper_addr_test: variable_name_inference with: @trace[0] sil [ossa] @copyable_to_moveonlywrapper_addr_test : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = alloc_stack $Klass, var, name "self" %1 = copyable_to_moveonlywrapper_addr %0 : $*Klass %2 = moveonlywrapper_to_copyable_addr %1 : $*@moveOnly Klass debug_value [trace] %2 : $*Klass dealloc_stack %0 : $*Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on test_tuple_destructure: variable_name_inference with: @trace[0] // CHECK: Input Value: (**%8**, %9) = destructure_tuple %7 : $(Klass, Klass) // CHECK: Name: 'y.0' // CHECK: Root: %5 = tuple (%1 : $Klass, %2 : $Klass) // CHECK: end running test 1 of 1 on test_tuple_destructure: variable_name_inference with: @trace[0] sil [ossa] @test_tuple_destructure : $@convention(thin) (@owned Klass, @guaranteed Klass, @guaranteed Klass) -> () { bb0(%0 : @owned $Klass, %1 : @guaranteed $Klass, %2 : @guaranteed $Klass): specify_test "variable_name_inference @trace[0]" %3 = alloc_stack [lexical] $Klass, var, name "x" store %0 to [init] %3 : $*Klass %5 = tuple (%1 : $Klass, %2 : $Klass) debug_value %5 : $(Klass, Klass), let, name "y", argno 2 %9 = copy_value %5 : $(Klass, Klass) (%10, %11) = destructure_tuple %9 : $(Klass, Klass) %12 = begin_access [modify] [static] %3 : $*Klass debug_value [trace] %10 : $Klass store %10 to [assign] %12 : $*Klass end_access %12 : $*Klass destroy_value %11 : $Klass destroy_addr %3 : $*Klass dealloc_stack %3 : $*Klass %18 = tuple () return %18 : $() } // CHECK-LABEL: begin running test 1 of 1 on test_tuple_extract: variable_name_inference with: @trace[0] // CHECK: Input Value: %9 = tuple_extract %8 : $(Klass, Klass), 0 // CHECK: Name: 'y.0' // CHECK: Root: %5 = tuple (%1 : $Klass, %2 : $Klass) // CHECK: end running test 1 of 1 on test_tuple_extract: variable_name_inference with: @trace[0] sil [ossa] @test_tuple_extract : $@convention(thin) (@owned Klass, @guaranteed Klass, @guaranteed Klass) -> () { bb0(%0 : @owned $Klass, %1 : @guaranteed $Klass, %2 : @guaranteed $Klass): specify_test "variable_name_inference @trace[0]" %3 = alloc_stack [lexical] $Klass, var, name "x" store %0 to [init] %3 : $*Klass %5 = tuple (%1 : $Klass, %2 : $Klass) debug_value %5 : $(Klass, Klass), let, name "y", argno 2 %9 = copy_value %5 : $(Klass, Klass) %9a = begin_borrow %9 : $(Klass, Klass) %10 = tuple_extract %9a : $(Klass, Klass), 0 debug_value [trace] %10 : $Klass end_borrow %9a : $(Klass, Klass) destroy_value %9 : $(Klass, Klass) destroy_addr %3 : $*Klass dealloc_stack %3 : $*Klass %18 = tuple () return %18 : $() } // CHECK-LABEL: begin running test 1 of 1 on test_struct_destructure: variable_name_inference with: @trace[0] // CHECK: Input Value: (%8, **%9**) = destructure_struct %7 : $KlassPair // CHECK: Name: 'y.rhs' // CHECK: Root: %5 = struct $KlassPair (%1 : $Klass, %2 : $Klass) // CHECK: end running test 1 of 1 on test_struct_destructure: variable_name_inference with: @trace[0] sil [ossa] @test_struct_destructure : $@convention(thin) (@owned Klass, @guaranteed Klass, @guaranteed Klass) -> () { bb0(%0 : @owned $Klass, %1 : @guaranteed $Klass, %2 : @guaranteed $Klass): specify_test "variable_name_inference @trace[0]" %3 = alloc_stack [lexical] $Klass, var, name "x" store %0 to [init] %3 : $*Klass %5 = struct $KlassPair (%1 : $Klass, %2 : $Klass) debug_value %5 : $KlassPair, let, name "y", argno 2 %9 = copy_value %5 : $KlassPair (%10, %11) = destructure_struct %9 : $KlassPair %12 = begin_access [modify] [static] %3 : $*Klass debug_value [trace] %11 : $Klass store %10 to [assign] %12 : $*Klass end_access %12 : $*Klass destroy_value %11 : $Klass destroy_addr %3 : $*Klass dealloc_stack %3 : $*Klass %18 = tuple () return %18 : $() } // CHECK-LABEL: begin running test 1 of 1 on test_struct_extract: variable_name_inference with: @trace[0] // CHECK: Input Value: %9 = struct_extract %8 : $KlassPair, #KlassPair.rhs // CHECK: Name: 'y.rhs' // CHECK: Root: %5 = struct $KlassPair (%1 : $Klass, %2 : $Klass) // CHECK: end running test 1 of 1 on test_struct_extract: variable_name_inference with: @trace[0] sil [ossa] @test_struct_extract : $@convention(thin) (@owned Klass, @guaranteed Klass, @guaranteed Klass) -> () { bb0(%0 : @owned $Klass, %1 : @guaranteed $Klass, %2 : @guaranteed $Klass): specify_test "variable_name_inference @trace[0]" %3 = alloc_stack [lexical] $Klass, var, name "x" store %0 to [init] %3 : $*Klass %5 = struct $KlassPair (%1 : $Klass, %2 : $Klass) debug_value %5 : $KlassPair, let, name "y", argno 2 %9 = copy_value %5 : $KlassPair %9a = begin_borrow %9 : $KlassPair %10 = struct_extract %9a : $KlassPair, #KlassPair.rhs debug_value [trace] %10 : $Klass end_borrow %9a : $KlassPair destroy_value %9 : $KlassPair destroy_addr %3 : $*Klass dealloc_stack %3 : $*Klass %18 = tuple () return %18 : $() } // CHECK-LABEL: begin running test 1 of 1 on test_klass_tuple_struct_lookthrough: variable_name_inference with: @trace[0] // CHECK: Input Value: %28 = load [copy] %27 : $*Klass // CHECK: Name: 'arg2.ns2.1.rhs' // CHECK: Root: %1 = argument of bb0 : $KlassWithKlassPair // CHECK: end running test 1 of 1 on test_klass_tuple_struct_lookthrough: variable_name_inference with: @trace[0] sil [ossa] @test_klass_tuple_struct_lookthrough : $@convention(thin) @async (@owned Klass, @guaranteed KlassWithKlassPair) -> () { bb0(%0 : @owned $Klass, %1 : @guaranteed $KlassWithKlassPair): debug_value %0 : $Klass, let, name "arg1", argno 1 debug_value %1 : $KlassWithKlassPair, let, name "arg2", argno 2 specify_test "variable_name_inference @trace[0]" %2 = alloc_stack [lexical] $Klass, var, name "x" store %0 to [init] %2 : $*Klass %7 = alloc_stack $KlassPair %8 = class_method %1 : $KlassWithKlassPair, #KlassWithKlassPair.ns1!getter : (KlassWithKlassPair) -> () -> KlassPair, $@convention(method) (@guaranteed KlassWithKlassPair) -> @owned KlassPair %9 = apply %8(%1) : $@convention(method) (@guaranteed KlassWithKlassPair) -> @owned KlassPair store %9 to [init] %7 : $*KlassPair %11 = struct_element_addr %7 : $*KlassPair, #KlassPair.rhs %12 = load [copy] %11 : $*Klass destroy_addr %7 : $*KlassPair %14 = begin_access [modify] [static] %2 : $*Klass store %12 to [assign] %14 : $*Klass end_access %14 : $*Klass dealloc_stack %7 : $*KlassPair %18 = alloc_stack $(KlassPair, KlassPair) %19 = tuple_element_addr %18 : $*(KlassPair, KlassPair), 0 %20 = tuple_element_addr %18 : $*(KlassPair, KlassPair), 1 %21 = class_method %1 : $KlassWithKlassPair, #KlassWithKlassPair.ns2!getter : (KlassWithKlassPair) -> () -> (KlassPair, KlassPair), $@convention(method) (@guaranteed KlassWithKlassPair) -> (@owned KlassPair, @owned KlassPair) %22 = apply %21(%1) : $@convention(method) (@guaranteed KlassWithKlassPair) -> (@owned KlassPair, @owned KlassPair) (%23, %24) = destructure_tuple %22 : $(KlassPair, KlassPair) store %23 to [init] %19 : $*KlassPair store %24 to [init] %20 : $*KlassPair %27 = tuple_element_addr %18 : $*(KlassPair, KlassPair), 1 %28 = struct_element_addr %27 : $*KlassPair, #KlassPair.rhs %29 = load [copy] %28 : $*Klass destroy_addr %18 : $*(KlassPair, KlassPair) %31 = begin_access [modify] [static] %2 : $*Klass debug_value [trace] %29 : $Klass store %29 to [assign] %31 : $*Klass end_access %31 : $*Klass dealloc_stack %18 : $*(KlassPair, KlassPair) destroy_addr %2 : $*Klass dealloc_stack %2 : $*Klass %37 = tuple () return %37 : $() } // CHECK-LABEL: begin running test 1 of 1 on test_klass_tuple_struct_lookthrough_with_copyaddr: variable_name_inference with: @trace[0] // CHECK: Input Value: %33 = load [copy] %32 : $*Klass // CHECK: Name: 'arg2.ns2.1.rhs' // CHECK: Root: %1 = argument of bb0 : $KlassWithKlassPair // CHECK: end running test 1 of 1 on test_klass_tuple_struct_lookthrough_with_copyaddr: variable_name_inference with: @trace[0] sil [ossa] @test_klass_tuple_struct_lookthrough_with_copyaddr : $@convention(thin) @async (@owned Klass, @guaranteed KlassWithKlassPair) -> () { bb0(%0 : @owned $Klass, %1 : @guaranteed $KlassWithKlassPair): debug_value %0 : $Klass, let, name "arg1", argno 1 debug_value %1 : $KlassWithKlassPair, let, name "arg2", argno 2 specify_test "variable_name_inference @trace[0]" %2 = alloc_stack [lexical] $Klass, var, name "x" store %0 to [init] %2 : $*Klass %7 = alloc_stack $KlassPair %8 = class_method %1 : $KlassWithKlassPair, #KlassWithKlassPair.ns1!getter : (KlassWithKlassPair) -> () -> KlassPair, $@convention(method) (@guaranteed KlassWithKlassPair) -> @owned KlassPair %9 = apply %8(%1) : $@convention(method) (@guaranteed KlassWithKlassPair) -> @owned KlassPair store %9 to [init] %7 : $*KlassPair %11 = struct_element_addr %7 : $*KlassPair, #KlassPair.rhs %12 = load [copy] %11 : $*Klass destroy_addr %7 : $*KlassPair %14 = begin_access [modify] [static] %2 : $*Klass store %12 to [assign] %14 : $*Klass end_access %14 : $*Klass dealloc_stack %7 : $*KlassPair %18 = alloc_stack $(KlassPair, KlassPair) %19 = tuple_element_addr %18 : $*(KlassPair, KlassPair), 0 %20 = tuple_element_addr %18 : $*(KlassPair, KlassPair), 1 %21 = class_method %1 : $KlassWithKlassPair, #KlassWithKlassPair.ns2!getter : (KlassWithKlassPair) -> () -> (KlassPair, KlassPair), $@convention(method) (@guaranteed KlassWithKlassPair) -> (@owned KlassPair, @owned KlassPair) %22 = apply %21(%1) : $@convention(method) (@guaranteed KlassWithKlassPair) -> (@owned KlassPair, @owned KlassPair) (%23, %24) = destructure_tuple %22 : $(KlassPair, KlassPair) store %23 to [init] %19 : $*KlassPair store %24 to [init] %20 : $*KlassPair %18a = alloc_stack $(KlassPair, KlassPair) %19a = tuple_element_addr %18a : $*(KlassPair, KlassPair), 0 copy_addr [take] %19 to [init] %19a : $*KlassPair %20a = tuple_element_addr %18a : $*(KlassPair, KlassPair), 1 copy_addr [take] %20 to [init] %20a : $*KlassPair %27 = tuple_element_addr %18a : $*(KlassPair, KlassPair), 1 %28 = struct_element_addr %27 : $*KlassPair, #KlassPair.rhs %29 = load [copy] %28 : $*Klass destroy_addr %18a : $*(KlassPair, KlassPair) %31 = begin_access [modify] [static] %2 : $*Klass debug_value [trace] %29 : $Klass store %29 to [assign] %31 : $*Klass end_access %31 : $*Klass dealloc_stack %18a : $*(KlassPair, KlassPair) dealloc_stack %18 : $*(KlassPair, KlassPair) destroy_addr %2 : $*Klass dealloc_stack %2 : $*Klass %37 = tuple () return %37 : $() } // CHECK-LABEL: begin running test 1 of 1 on function_argument_inference_through_structextract: variable_name_inference with: @trace[0] // CHECK: Input Value: %3 = copy_value %2 : $Klass // CHECK: Name: 'self.lhs' // CHECK: Root: %0 = argument of bb0 : $KlassPair // CHECK: end running test 1 of 1 on function_argument_inference_through_structextract: variable_name_inference with: @trace[0] sil [ossa] @function_argument_inference_through_structextract : $@convention(thin) (@guaranteed KlassPair) -> @owned Klass { bb0(%0 : @guaranteed $KlassPair): specify_test "variable_name_inference @trace[0]" debug_value %0 : $KlassPair, let, name "self", argno 1 %2 = struct_extract %0 : $KlassPair, #KlassPair.lhs %3 = copy_value %2 : $Klass debug_value [trace] %3 : $Klass return %3 : $Klass } // CHECK-LABEL: begin running test 1 of 1 on function_argument_inference_through_uncheckedenumdata: variable_name_inference with: @trace[0] // CHECK: Input Value: %3 = copy_value %2 : $Klass // CHECK: Name: 'self.some' // CHECK: Root: %0 = argument of bb0 : $FakeOptional // CHECK: end running test 1 of 1 on function_argument_inference_through_uncheckedenumdata: variable_name_inference with: @trace[0] sil [ossa] @function_argument_inference_through_uncheckedenumdata : $@convention(thin) (@guaranteed FakeOptional) -> @owned Klass { bb0(%0 : @guaranteed $FakeOptional): specify_test "variable_name_inference @trace[0]" debug_value %0 : $FakeOptional, let, name "self", argno 1 %2 = unchecked_enum_data %0 : $FakeOptional, #FakeOptional.some!enumelt %3 = copy_value %2 : $Klass debug_value [trace] %3 : $Klass return %3 : $Klass } // CHECK-LABEL: begin running test 1 of 1 on function_argument_inference_through_uncheckedtakeenumdataaddr: variable_name_inference with: @trace[0] // CHECK: Input Value: %3 = load [take] %2 : $*Klass // CHECK: Name: 'self.some' // CHECK: Root: %0 = argument of bb0 : $*FakeOptional // CHECK: end running test 1 of 1 on function_argument_inference_through_uncheckedtakeenumdataaddr: variable_name_inference with: @trace[0] sil [ossa] @function_argument_inference_through_uncheckedtakeenumdataaddr : $@convention(thin) (@in FakeOptional) -> @owned Klass { bb0(%0 : $*FakeOptional): specify_test "variable_name_inference @trace[0]" debug_value %0 : $*FakeOptional, let, name "self", argno 1 %2 = unchecked_take_enum_data_addr %0 : $*FakeOptional, #FakeOptional.some!enumelt %3 = load [take] %2 : $*Klass debug_value [trace] %3 : $Klass return %3 : $Klass } // CHECK-LABEL: begin running test 1 of 1 on function_argument_inference_through_uncheckedtakeenumdataaddr_2: variable_name_inference with: @trace[0] // CHECK: Input Value: %2 = unchecked_take_enum_data_addr %0 // CHECK: Name: 'self.some' // CHECK: Root: %0 = argument of bb0 : $*FakeOptional // CHECK: end running test 1 of 1 on function_argument_inference_through_uncheckedtakeenumdataaddr_2: variable_name_inference with: @trace[0] sil [ossa] @function_argument_inference_through_uncheckedtakeenumdataaddr_2 : $@convention(thin) (@in FakeOptional) -> @owned Klass { bb0(%0 : $*FakeOptional): specify_test "variable_name_inference @trace[0]" debug_value %0 : $*FakeOptional, let, name "self", argno 1 %2 = unchecked_take_enum_data_addr %0 : $*FakeOptional, #FakeOptional.some!enumelt debug_value [trace] %2 : $*Klass %3 = load [take] %2 : $*Klass return %3 : $Klass } // For diamonds, we just recursively visit the uses of the phi and take the // first one that gives a value. This is generally used for diagnostics, so we // are ok with just giving one. // // TODO: If we need to do better, we can perhaps emit all of them. // CHECK-LABEL: begin running test 1 of 1 on handle_diamond: variable_name_inference with: @trace[0] // CHECK: Input Value: %9 = argument of bb3 // CHECK: Name: 'myname.some' // CHECK: Root: %0 = argument of bb0 // CHECK: end running test 1 of 1 on handle_diamond: variable_name_inference with: @trace[0] sil [ossa] @handle_diamond : $@convention(method) (@guaranteed FirstSecondEnum) -> @sil_sending @owned FakeOptional { bb0(%0 : @guaranteed $FirstSecondEnum): specify_test "variable_name_inference @trace[0]" debug_value %0 : $FirstSecondEnum, var, name "myname" switch_enum %0 : $FirstSecondEnum, case #FirstSecondEnum.first!enumelt: bb1, case #FirstSecondEnum.second!enumelt: bb2 bb1: %nil = enum $FakeOptional, #FakeOptional.none!enumelt br bb3(%nil : $FakeOptional) bb2(%1 : @guaranteed $Klass): %2 = copy_value %1 : $Klass %3 = enum $FakeOptional, #FakeOptional.some!enumelt, %2 : $Klass br bb3(%3 : $FakeOptional) bb3(%4 : @owned $FakeOptional): debug_value [trace] %4 : $FakeOptional return %4 : $FakeOptional } // For diamonds, we just recursively visit the uses of the phi and take the // first one that gives a value. This is generally used for diagnostics, so we // are ok with just giving one. // // TODO: If we need to do better, we can perhaps emit all of them. // CHECK-LABEL: begin running test 1 of 1 on handle_loop: variable_name_inference with: @trace[0] // CHECK: Input Value: %16 = argument of bb5 // CHECK: Name: 'myname.some.third' // CHECK: Root: %0 = argument of bb0 // CHECK: end running test 1 of 1 on handle_loop: variable_name_inference with: @trace[0] sil [ossa] @handle_loop : $@convention(method) (@guaranteed FirstSecondThirdEnum) -> @sil_sending @owned FirstSecondThirdEnum { bb0(%0 : @guaranteed $FirstSecondThirdEnum): specify_test "variable_name_inference @trace[0]" debug_value %0 : $FirstSecondThirdEnum, var, name "myname" %0a = copy_value %0 : $FirstSecondThirdEnum br bb1(%0a : $FirstSecondThirdEnum) bb1(%1a : @owned $FirstSecondThirdEnum): br bb2(%1a : $FirstSecondThirdEnum) bb2(%1b : @owned $FirstSecondThirdEnum): switch_enum %1b : $FirstSecondThirdEnum, case #FirstSecondThirdEnum.first!enumelt: bb3, case #FirstSecondThirdEnum.second!enumelt: bb4, case #FirstSecondThirdEnum.third!enumeult: bb4a bb3: %nil = enum $FirstSecondThirdEnum, #FirstSecondThirdEnum.first!enumelt br bb5(%nil : $FirstSecondThirdEnum) bb4(%1 : @owned $Klass): %2 = copy_value %1 : $Klass %3 = enum $FakeOptional, #FakeOptional.some!enumelt, %2 : $Klass %3a = enum $FirstSecondThirdEnum, #FirstSecondThirdEnum.third!enumelt, %3 : $FakeOptional destroy_value %1 : $Klass br bb5(%3a : $FirstSecondThirdEnum) bb5(%4 : @owned $FirstSecondThirdEnum): br bb6 bb6: cond_br undef, bb7, bb8 bb7: br bb1(%4 : $FirstSecondThirdEnum) bb4a(%unused : @owned $FakeOptional): unreachable bb8: debug_value [trace] %4 : $FirstSecondThirdEnum return %4 : $FirstSecondThirdEnum } // Make sure that we properly scope by switching edge order. // // CHECK-LABEL: begin running test 1 of 1 on handle_loop_other_order: variable_name_inference with: @trace[0] // CHECK: Input Value: %16 = argument of bb5 // CHECK: Name: 'myname.some.third' // CHECK: Root: %0 = argument of bb0 // CHECK: end running test 1 of 1 on handle_loop_other_order: variable_name_inference with: @trace[0] sil [ossa] @handle_loop_other_order : $@convention(method) (@guaranteed FirstSecondThirdEnum) -> @sil_sending @owned FirstSecondThirdEnum { bb0(%0 : @guaranteed $FirstSecondThirdEnum): specify_test "variable_name_inference @trace[0]" debug_value %0 : $FirstSecondThirdEnum, var, name "myname" %0a = copy_value %0 : $FirstSecondThirdEnum br bb1(%0a : $FirstSecondThirdEnum) bb1(%1a : @owned $FirstSecondThirdEnum): br bb2(%1a : $FirstSecondThirdEnum) bb2(%1b : @owned $FirstSecondThirdEnum): switch_enum %1b : $FirstSecondThirdEnum, case #FirstSecondThirdEnum.first!enumelt: bb4, case #FirstSecondThirdEnum.second!enumelt: bb3, case #FirstSecondThirdEnum.third!enumeult: bb4a bb3(%1 : @owned $Klass): %2 = copy_value %1 : $Klass %3 = enum $FakeOptional, #FakeOptional.some!enumelt, %2 : $Klass %3a = enum $FirstSecondThirdEnum, #FirstSecondThirdEnum.third!enumelt, %3 : $FakeOptional destroy_value %1 : $Klass br bb5(%3a : $FirstSecondThirdEnum) bb4: %nil = enum $FirstSecondThirdEnum, #FirstSecondThirdEnum.first!enumelt br bb5(%nil : $FirstSecondThirdEnum) bb5(%4 : @owned $FirstSecondThirdEnum): br bb6 bb6: cond_br undef, bb7, bb8 bb7: br bb1(%4 : $FirstSecondThirdEnum) bb4a(%unused : @owned $FakeOptional): unreachable bb8: debug_value [trace] %4 : $FirstSecondThirdEnum return %4 : $FirstSecondThirdEnum } // Test that we can properly handle code generation from a borrowing loadable parameter // // CHECK-LABEL: begin running test 1 of 1 on loadable_borrowing_test: variable_name_inference with: @trace[0] // CHECK: Input Value: %8 = store_borrow %6 to %7 : $*Klass // user: %9 // CHECK: Name: 'x' // CHECK: Root: %3 = mark_unresolved_non_copyable_value [no_consume_or_assign] %2 // CHECK: end running test 1 of 1 on loadable_borrowing_test: variable_name_inference with: @trace[0] sil hidden [ossa] @loadable_borrowing_test : $@convention(thin) @async (@guaranteed Klass) -> () { bb0(%0 : @noImplicitCopy @guaranteed $Klass): specify_test "variable_name_inference @trace[0]" %1 = copyable_to_moveonlywrapper [guaranteed] %0 : $Klass %2 = copy_value %1 : $@moveOnly Klass %3 = mark_unresolved_non_copyable_value [no_consume_or_assign] %2 : $@moveOnly Klass debug_value %3 : $@moveOnly Klass, let, name "x", argno 1 %7 = begin_borrow %3 : $@moveOnly Klass %8 = moveonlywrapper_to_copyable [guaranteed] %7 : $@moveOnly Klass %9 = alloc_stack $Klass %10 = store_borrow %8 to %9 : $*Klass debug_value [trace] %10 : $*Klass end_borrow %10 : $*Klass dealloc_stack %9 : $*Klass end_borrow %7 : $@moveOnly Klass destroy_value %3 : $@moveOnly Klass %25 = tuple () return %25 : $() } // CHECK-LABEL: begin running test 1 of 1 on store_borrow_tuple_test: variable_name_inference with: @trace[0] // CHECK: Input Value: %25 = store_borrow %23 to %24 : $*Klass // CHECK: Name: 'z' // CHECK: Root: %20 = move_value [lexical] [var_decl] %19 : $Klass // CHECK: end running test 1 of 1 on store_borrow_tuple_test: variable_name_inference with: @trace[0] sil hidden [ossa] @store_borrow_tuple_test : $@convention(thin) @async () -> () { bb0: specify_test "variable_name_inference @trace[0]" %2 = integer_literal $Builtin.IntLiteral, 0 %7 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %8 = apply %7() : $@convention(thin) () -> @owned Klass %9 = tuple (%2 : $Builtin.IntLiteral, %8 : $Klass) %10 = move_value [lexical] [var_decl] %9 : $(Builtin.IntLiteral, Klass) debug_value %10 : $(Builtin.IntLiteral, Klass), let, name "test" %12 = begin_borrow %10 : $(Builtin.IntLiteral, Klass) (%13, %14) = destructure_tuple %12 : $(Builtin.IntLiteral, Klass) %15 = copy_value %14 : $Klass %16 = tuple (%13 : $Builtin.IntLiteral, %15 : $Klass) %17 = alloc_stack $(Builtin.IntLiteral, Klass) store %16 to [init] %17 : $*(Builtin.IntLiteral, Klass) // original location of use. destroy_addr %17 : $*(Builtin.IntLiteral, Klass) dealloc_stack %17 : $*(Builtin.IntLiteral, Klass) end_borrow %12 : $(Builtin.IntLiteral, Klass) %25 = begin_borrow %10 : $(Builtin.IntLiteral, Klass) %26 = copy_value %25 : $(Builtin.IntLiteral, Klass) (%27, %28) = destructure_tuple %26 : $(Builtin.IntLiteral, Klass) %29 = move_value [lexical] [var_decl] %28 : $Klass debug_value %29 : $Klass, let, name "z" end_borrow %25 : $(Builtin.IntLiteral, Klass) %32 = begin_borrow %29 : $Klass %33 = alloc_stack $Klass %34 = store_borrow %32 to %33 : $*Klass debug_value [trace] %34 : $*Klass %35 = function_ref @useIndirect : $@convention(thin) <τ_0_0> (@in_guaranteed τ_0_0) -> () %36 = apply %35(%34) : $@convention(thin) <τ_0_0> (@in_guaranteed τ_0_0) -> () end_borrow %34 : $*Klass dealloc_stack %33 : $*Klass end_borrow %32 : $Klass %40 = begin_borrow %10 : $(Builtin.IntLiteral, Klass) (%41, %42) = destructure_tuple %40 : $(Builtin.IntLiteral, Klass) %43 = copy_value %42 : $Klass %44 = tuple (%41 : $Builtin.IntLiteral, %43 : $Klass) %45 = alloc_stack $(Builtin.IntLiteral, Klass) store %44 to [init] %45 : $*(Builtin.IntLiteral, Klass) %48 = apply %35<(Builtin.IntLiteral, Klass)>(%45) : $@convention(thin) <τ_0_0> (@in_guaranteed τ_0_0) -> () destroy_addr %45 : $*(Builtin.IntLiteral, Klass) dealloc_stack %45 : $*(Builtin.IntLiteral, Klass) end_borrow %40 : $(Builtin.IntLiteral, Klass) destroy_value %29 : $Klass destroy_value %10 : $(Builtin.IntLiteral, Klass) %54 = tuple () return %54 : $() } // CHECK-LABEL: begin running test 1 of 1 on store_borrow_tuple_test_2: variable_name_inference with: @trace[0] // CHECK: Input Value: %11 = alloc_stack $(Builtin.IntLiteral, Klass) // CHECK: Name: 'test' // CHECK: Root: %4 = move_value [lexical] [var_decl] %3 : $(Builtin.IntLiteral, Klass) // CHECK: end running test 1 of 1 on store_borrow_tuple_test_2: variable_name_inference with: @trace[0] sil hidden [ossa] @store_borrow_tuple_test_2 : $@convention(thin) @async () -> () { bb0: specify_test "variable_name_inference @trace[0]" %2 = integer_literal $Builtin.IntLiteral, 0 %7 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %8 = apply %7() : $@convention(thin) () -> @owned Klass %9 = tuple (%2 : $Builtin.IntLiteral, %8 : $Klass) %10 = move_value [lexical] [var_decl] %9 : $(Builtin.IntLiteral, Klass) debug_value %10 : $(Builtin.IntLiteral, Klass), let, name "test" %12 = begin_borrow %10 : $(Builtin.IntLiteral, Klass) (%13, %14) = destructure_tuple %12 : $(Builtin.IntLiteral, Klass) %15 = copy_value %14 : $Klass %16 = tuple (%13 : $Builtin.IntLiteral, %15 : $Klass) %17 = alloc_stack $(Builtin.IntLiteral, Klass) store %16 to [init] %17 : $*(Builtin.IntLiteral, Klass) debug_value [trace] %17 : $*(Builtin.IntLiteral, Klass) // original location of use. destroy_addr %17 : $*(Builtin.IntLiteral, Klass) dealloc_stack %17 : $*(Builtin.IntLiteral, Klass) end_borrow %12 : $(Builtin.IntLiteral, Klass) %25 = begin_borrow %10 : $(Builtin.IntLiteral, Klass) %26 = copy_value %25 : $(Builtin.IntLiteral, Klass) (%27, %28) = destructure_tuple %26 : $(Builtin.IntLiteral, Klass) %29 = move_value [lexical] [var_decl] %28 : $Klass debug_value %29 : $Klass, let, name "z" end_borrow %25 : $(Builtin.IntLiteral, Klass) %32 = begin_borrow %29 : $Klass %33 = alloc_stack $Klass %34 = store_borrow %32 to %33 : $*Klass %35 = function_ref @useIndirect : $@convention(thin) <τ_0_0> (@in_guaranteed τ_0_0) -> () %36 = apply %35(%34) : $@convention(thin) <τ_0_0> (@in_guaranteed τ_0_0) -> () end_borrow %34 : $*Klass dealloc_stack %33 : $*Klass end_borrow %32 : $Klass %40 = begin_borrow %10 : $(Builtin.IntLiteral, Klass) (%41, %42) = destructure_tuple %40 : $(Builtin.IntLiteral, Klass) %43 = copy_value %42 : $Klass %44 = tuple (%41 : $Builtin.IntLiteral, %43 : $Klass) %45 = alloc_stack $(Builtin.IntLiteral, Klass) store %44 to [init] %45 : $*(Builtin.IntLiteral, Klass) %48 = apply %35<(Builtin.IntLiteral, Klass)>(%45) : $@convention(thin) <τ_0_0> (@in_guaranteed τ_0_0) -> () destroy_addr %45 : $*(Builtin.IntLiteral, Klass) dealloc_stack %45 : $*(Builtin.IntLiteral, Klass) end_borrow %40 : $(Builtin.IntLiteral, Klass) destroy_value %29 : $Klass destroy_value %10 : $(Builtin.IntLiteral, Klass) %54 = tuple () return %54 : $() } // CHECK-LABEL: begin running test 1 of 1 on init_existential_addr_temporary: variable_name_inference with: @trace[0] // CHECK: Input Value: %2 = alloc_stack $Any // CHECK: Name: 'my arg' // CHECK: Root: %0 = argument of bb0 // CHECK: end running test 1 of 1 on init_existential_addr_temporary: variable_name_inference with: @trace[0] sil [ossa] @init_existential_addr_temporary : $@convention(thin) (@owned Klass) -> () { bb0(%0 : @owned $Klass): specify_test "variable_name_inference @trace[0]" debug_value %0 : $Klass, var, name "my arg" %1 = alloc_stack $Any %2 = init_existential_addr %1 : $*Any, $Klass store %0 to [init] %2 : $*Klass debug_value [trace] %1 : $*Any destroy_addr %1 : $*Any dealloc_stack %1 : $*Any %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on init_existential_addr_temporary_copy_addr: variable_name_inference with: @trace[0] // CHECK: Input Value: %2 = alloc_stack $Any // CHECK: Name: 'my arg' // CHECK: Root: %0 = argument of bb0 // CHECK: end running test 1 of 1 on init_existential_addr_temporary_copy_addr: variable_name_inference with: @trace[0] sil [ossa] @init_existential_addr_temporary_copy_addr : $@convention(thin) (@in Klass) -> () { bb0(%0 : $*Klass): specify_test "variable_name_inference @trace[0]" debug_value %0 : $*Klass, var, name "my arg" %1 = alloc_stack $Any %2 = init_existential_addr %1 : $*Any, $Klass copy_addr [take] %0 to [init] %2 : $*Klass debug_value [trace] %1 : $*Any destroy_addr %1 : $*Any dealloc_stack %1 : $*Any %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on move_value_var_decl: variable_name_inference with: @trace[0] // CHECK: Input Value: %2 = move_value [var_decl] %1 : $Klass // CHECK: Name: 'MyName' // CHECK: Root: %2 = move_value [var_decl] %1 : $Klass // CHECK: end running test 1 of 1 on move_value_var_decl: variable_name_inference with: @trace[0] sil [ossa] @move_value_var_decl : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %1 = apply %0() : $@convention(thin) () -> @owned Klass %2 = move_value [var_decl] %1 : $Klass debug_value %2 : $Klass, let, name "MyName" debug_value [trace] %2 : $Klass destroy_value %2 : $Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on move_value_var_decl_2: variable_name_inference with: @trace[0] // CHECK: Input Value: %1 = apply %0() : $@convention(thin) () -> @owned Klass // CHECK: Name: 'MyName' // CHECK: Root: %1 = apply %0() : $@convention(thin) () -> @owned Klass // CHECK: end running test 1 of 1 on move_value_var_decl_2: variable_name_inference with: @trace[0] sil [ossa] @move_value_var_decl_2 : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %1 = apply %0() : $@convention(thin) () -> @owned Klass debug_value [trace] %1 : $Klass %2 = move_value [var_decl] %1 : $Klass debug_value %2 : $Klass, let, name "MyName" destroy_value %2 : $Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on move_value_var_decl_3: variable_name_inference with: @trace[0] // CHECK-LABEL: Input Value: %1 = apply %0() : $@convention(thin) () -> @owned Klass // CHECK-LABEL: Name: 'unknown' // CHECK-LABEL: Root: 'unknown' // CHECK-LABEL: end running test 1 of 1 on move_value_var_decl_3: variable_name_inference with: @trace[0] sil [ossa] @move_value_var_decl_3 : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %1 = apply %0() : $@convention(thin) () -> @owned Klass debug_value [trace] %1 : $Klass %2 = move_value %1 : $Klass debug_value %2 : $Klass, let, name "MyName" destroy_value %2 : $Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on begin_borrow_var_decl: variable_name_inference with: @trace[0] // CHECK: Input Value: %2 = begin_borrow [var_decl] %1 : $Klass // CHECK: Name: 'MyName' // CHECK: Root: %2 = begin_borrow [var_decl] %1 : $Klass // CHECK: end running test 1 of 1 on begin_borrow_var_decl: variable_name_inference with: @trace[0] sil [ossa] @begin_borrow_var_decl : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %1 = apply %0() : $@convention(thin) () -> @owned Klass %2 = begin_borrow [var_decl] %1 : $Klass debug_value %2 : $Klass, let, name "MyName" debug_value [trace] %2 : $Klass end_borrow %2 : $Klass destroy_value %1 : $Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on begin_borrow_var_decl_2: variable_name_inference with: @trace[0] // CHECK: Input Value: %1 = apply %0() : $@convention(thin) () -> @owned Klass // CHECK: Name: 'MyName' // CHECK: Root: %1 = apply %0() : $@convention(thin) () -> @owned Klass // CHECK: end running test 1 of 1 on begin_borrow_var_decl_2: variable_name_inference with: @trace[0] sil [ossa] @begin_borrow_var_decl_2 : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %1 = apply %0() : $@convention(thin) () -> @owned Klass debug_value [trace] %1 : $Klass %2 = begin_borrow [var_decl] %1 : $Klass debug_value %2 : $Klass, let, name "MyName" end_borrow %2 : $Klass destroy_value %1 : $Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on begin_borrow_var_decl_3: variable_name_inference with: @trace[0] // CHECK: Input Value: %1 = apply %0() : $@convention(thin) () -> @owned Klass // CHECK: Name: 'unknown' // CHECK: Root: 'unknown' // CHECK: end running test 1 of 1 on begin_borrow_var_decl_3: variable_name_inference with: @trace[0] sil [ossa] @begin_borrow_var_decl_3 : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @getKlass : $@convention(thin) () -> @owned Klass %1 = apply %0() : $@convention(thin) () -> @owned Klass debug_value [trace] %1 : $Klass %2 = begin_borrow %1 : $Klass debug_value %2 : $Klass, let, name "MyName" end_borrow %2 : $Klass destroy_value %1 : $Klass %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on infer_through_end_init_let_ref: variable_name_inference with: @trace[0] // CHECK: Input Value: %2 = end_init_let_ref %0 : $Klass // CHECK: Name: 'self' // CHECK: Root: %0 = argument of bb0 : $Klass // CHECK: end running test 1 of 1 on infer_through_end_init_let_ref: variable_name_inference with: @trace[0] sil [ossa] @infer_through_end_init_let_ref : $@convention(thin) (@owned Klass) -> @owned Klass { bb0(%0 : @owned $Klass): specify_test "variable_name_inference @trace[0]" debug_value %0 : $Klass, let, name "self", argno 2 %1 = end_init_let_ref %0 : $Klass debug_value [trace] %1 : $Klass return %1 : $Klass } // CHECK-LABEL: begin running test 1 of 1 on infer_for_closure: variable_name_inference with: @trace[0] // CHECK: Input Value: %5 = convert_escape_to_noescape [not_guaranteed] %4 : $@callee_guaranteed () -> () to $@noescape @callee_guaranteed () -> () // CHECK: Name: 'closure1' // CHECK: Root: %2 = move_value [lexical] [var_decl] %1 : $@callee_guaranteed () -> () // CHECK: end running test 1 of 1 on infer_for_closure: variable_name_inference with: @trace[0] sil [ossa] @infer_for_closure : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @sideEffect : $@convention(thin) () -> () %1 = partial_apply [callee_guaranteed] %0() : $@convention(thin) () -> () %2 = move_value [lexical] [var_decl] %1 : $@callee_guaranteed () -> () debug_value %2 : $@callee_guaranteed () -> (), let, name "closure1" %3 = copy_value %2 : $@callee_guaranteed () -> () %4 = convert_escape_to_noescape [not_guaranteed] %3 : $@callee_guaranteed () -> () to $@noescape @callee_guaranteed () -> () debug_value [trace] %4 : $@noescape @callee_guaranteed () -> () destroy_value %4 : $@noescape @callee_guaranteed () -> () destroy_value %3 : $@callee_guaranteed () -> () destroy_value %2 : $@callee_guaranteed () -> () %9999 = tuple () return %9999 : $() } // CHECK-LABEL: begin running test 1 of 1 on infer_through_convert_function: variable_name_inference with: @trace[0] // CHECK: Input Value: // function_ref sideEffect // CHECK-NEXT: %0 = function_ref @sideEffect // CHECK: Name: 'closure' // CHECK: Root: // function_ref sideEffect // CHECK-NEXT: %0 = function_ref @sideEffect // CHECK: end running test 1 of 1 on infer_through_convert_function: variable_name_inference with: @trace[0] sil [ossa] @infer_through_convert_function : $@convention(thin) () -> () { bb0: specify_test "variable_name_inference @trace[0]" %0 = function_ref @sideEffect : $@convention(thin) () -> () debug_value %0 : $@convention(thin) () -> (), let, name "closure" %1 = convert_function %0 : $@convention(thin) () -> () to $@convention(thin) () -> () debug_value [trace] %0 : $@convention(thin) () -> () %9999 = tuple () return %9999 : $() }