mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-11-10 12:28:25 +00:00
Determining that a type has trivial destruction requires checking whether all of its subobjects have trivial destruction and whether its type has a custom witness for `Destroy.Op`. This isn't possible when `Destroy` is the custodian for `Destroy.Op` and `SubobjectDestroy.Op`, so we need to make `SubobjectDestroy` its own interface. `Destroy.SelfDestruct` becomes a standalone function because it depends on `SubobjectDestroy` and `Destroy` being implemented, and is also responsible for generating any custom witnesses for both interfaces. Making `SelfDestruct` an interface was experimented with, but this required a blanket impl that caused issues for facet types. `Destroy` depends on `SubobjectDestroy` to be implemented. We'd ideally use `require impls SubobjectDestroy`, but it isn't complete yet, and it also causes problems when `Destroy` is implemented inside the class definition. We work around this by temporarily renaming the `Destroy` interface to `DestroyImpl`, and introducing a constraint called `Destroy` so that user code doesn't need to write `Core.SubobjectDestroy & Core.Destroy`.
299 lines
24 KiB
Plaintext
299 lines
24 KiB
Plaintext
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
|
|
// Exceptions. See /LICENSE for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
// INCLUDE-FILE: toolchain/testing/testdata/min_prelude/convert.carbon
|
|
//
|
|
// AUTOUPDATE
|
|
// TIP: To test this file alone, run:
|
|
// TIP: bazel test //toolchain/testing:file_test --test_arg=--file_tests=toolchain/check/testdata/function/generic/default_values.carbon
|
|
// TIP: To dump output, run:
|
|
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/function/generic/default_values.carbon
|
|
|
|
// --- generic_fn_specific_param.carbon
|
|
library "[[@TEST_NAME]]";
|
|
|
|
interface Z {}
|
|
|
|
class D { adapt {}; }
|
|
|
|
class E { adapt {}; }
|
|
impl E as Z {}
|
|
|
|
class C(T: Z) {
|
|
var d: D;
|
|
}
|
|
|
|
//@dump-sem-ir-begin
|
|
fn Make(generic T: Z, unused t: T, d: D = {} as D) -> C(T) {
|
|
return {.d = d} as C(T);
|
|
}
|
|
|
|
fn G() {
|
|
let _: C(E) = Make(E, {} as E);
|
|
}
|
|
//@dump-sem-ir-end
|
|
|
|
|
|
// CHECK:STDOUT: --- generic_fn_specific_param.carbon
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: constants {
|
|
// CHECK:STDOUT: type: type = facet_type <type> [concrete]
|
|
// CHECK:STDOUT: %Z.type: type = facet_type <@Z> [concrete]
|
|
// CHECK:STDOUT: %D: type = class_type @D [concrete]
|
|
// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete]
|
|
// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete]
|
|
// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete]
|
|
// CHECK:STDOUT: %complete_type.357: <witness> = complete_type_witness %empty_struct_type [concrete]
|
|
// CHECK:STDOUT: %E: type = class_type @E [concrete]
|
|
// CHECK:STDOUT: %Z.impl_witness: <witness> = impl_witness @E.as.Z.impl.%Z.impl_witness_table [concrete]
|
|
// CHECK:STDOUT: %Z.facet: %Z.type = facet_value %E, (%Z.impl_witness) [concrete]
|
|
// CHECK:STDOUT: %.Self.frozen: type = symbolic_binding .Self [symbolic_self]
|
|
// CHECK:STDOUT: %pattern_type.5d7: type = pattern_type %Z.type [concrete]
|
|
// CHECK:STDOUT: %T.patt.4a7: %pattern_type.5d7 = symbolic_binding_pattern T, 0 [symbolic]
|
|
// CHECK:STDOUT: %T.013: %Z.type = symbolic_binding T, 0 [symbolic]
|
|
// CHECK:STDOUT: %C.type: type = parameterized_class_name_type @C [concrete]
|
|
// CHECK:STDOUT: %C.generic: %C.type = struct_value () [concrete]
|
|
// CHECK:STDOUT: %C.ccf: type = class_type @C, @C(%T.013) [symbolic]
|
|
// CHECK:STDOUT: %pattern_type.d8d: type = pattern_type %D [concrete]
|
|
// CHECK:STDOUT: %struct_type.d.67c: type = struct_type {.d: %D} [concrete]
|
|
// CHECK:STDOUT: %complete_type.e41: <witness> = complete_type_witness %struct_type.d.67c [concrete]
|
|
// CHECK:STDOUT: %T.as_type.ff1: type = facet_access_type %T.013 [symbolic]
|
|
// CHECK:STDOUT: %pattern_type.cab: type = pattern_type %T.as_type.ff1 [symbolic]
|
|
// CHECK:STDOUT: %t.param_patt.571: %pattern_type.cab = value_param_pattern [symbolic]
|
|
// CHECK:STDOUT: %t.patt.a08: %pattern_type.cab = wrapper_binding_pattern t, %t.param_patt.571 [symbolic]
|
|
// CHECK:STDOUT: %d.param_patt: %pattern_type.d8d = value_param_pattern [concrete]
|
|
// CHECK:STDOUT: %d.patt: %pattern_type.d8d = wrapper_binding_pattern d, %d.param_patt [concrete]
|
|
// CHECK:STDOUT: %D.val: %D = struct_value () [concrete]
|
|
// CHECK:STDOUT: %.ec6: %pattern_type.d8d = default_value_pattern %d.patt, %D.val [concrete]
|
|
// CHECK:STDOUT: %.20e: Core.Form = init_form %C.ccf [symbolic]
|
|
// CHECK:STDOUT: %pattern_type.aa1: type = pattern_type %C.ccf [symbolic]
|
|
// CHECK:STDOUT: %return.param_patt.c22: %pattern_type.aa1 = out_param_pattern [symbolic]
|
|
// CHECK:STDOUT: %return.patt.a2c: %pattern_type.aa1 = return_slot_pattern %return.param_patt.c22, %C.ccf [symbolic]
|
|
// CHECK:STDOUT: %Make.type: type = fn_type @Make [concrete]
|
|
// CHECK:STDOUT: %Make: %Make.type = struct_value () [concrete]
|
|
// CHECK:STDOUT: %require_complete.e12: <witness> = require_complete_type %T.as_type.ff1 [symbolic]
|
|
// CHECK:STDOUT: %require_complete.f24: <witness> = require_complete_type %C.ccf [symbolic]
|
|
// CHECK:STDOUT: %C.val.e90: %C.ccf = struct_value (%D.val) [symbolic]
|
|
// CHECK:STDOUT: %G.type: type = fn_type @G [concrete]
|
|
// CHECK:STDOUT: %G: %G.type = struct_value () [concrete]
|
|
// CHECK:STDOUT: %C.10f: type = class_type @C, @C(%Z.facet) [concrete]
|
|
// CHECK:STDOUT: %C.elem.a58: type = unbound_element_type %C.10f, %D [concrete]
|
|
// CHECK:STDOUT: %pattern_type.b01: type = pattern_type %C.10f [concrete]
|
|
// CHECK:STDOUT: %_.patt: %pattern_type.b01 = value_binding_pattern _ [concrete]
|
|
// CHECK:STDOUT: %E.val: %E = struct_value () [concrete]
|
|
// CHECK:STDOUT: %pattern_type.849: type = pattern_type %E [concrete]
|
|
// CHECK:STDOUT: %t.param_patt.307: %pattern_type.849 = value_param_pattern [concrete]
|
|
// CHECK:STDOUT: %t.patt.404: %pattern_type.849 = wrapper_binding_pattern t, %t.param_patt.307 [concrete]
|
|
// CHECK:STDOUT: %.c85: Core.Form = init_form %C.10f [concrete]
|
|
// CHECK:STDOUT: %return.param_patt.a86: %pattern_type.b01 = out_param_pattern [concrete]
|
|
// CHECK:STDOUT: %return.patt.4c6: %pattern_type.b01 = return_slot_pattern %return.param_patt.a86, %C.10f [concrete]
|
|
// CHECK:STDOUT: %Make.specific_fn: <specific function> = specific_function %Make, @Make(%Z.facet) [concrete]
|
|
// CHECK:STDOUT: %Destroy.type: type = facet_type <@Destroy> [concrete]
|
|
// CHECK:STDOUT: %SubobjectDestroy.type: type = facet_type <@SubobjectDestroy> [concrete]
|
|
// CHECK:STDOUT: %T.09f: %SubobjectDestroy.type = symbolic_binding T, 0 [symbolic]
|
|
// CHECK:STDOUT: %T.as_type.as.DestroyImpl.impl.Op.type.dea: type = fn_type @T.as_type.as.DestroyImpl.impl.Op, @T.as_type.as.DestroyImpl.impl(%T.09f) [symbolic]
|
|
// CHECK:STDOUT: %T.as_type.as.DestroyImpl.impl.Op.6e5: %T.as_type.as.DestroyImpl.impl.Op.type.dea = struct_value () [symbolic]
|
|
// CHECK:STDOUT: %SubobjectDestroy.WithSelf.Op.type.6870fd.2: type = fn_type @SubobjectDestroy.WithSelf.Op.loc20_32.2 [concrete]
|
|
// CHECK:STDOUT: %SubobjectDestroy.WithSelf.Op.30f1ee.2: %SubobjectDestroy.WithSelf.Op.type.6870fd.2 = struct_value () [concrete]
|
|
// CHECK:STDOUT: %custom_witness.b80ef6.2: <witness> = custom_witness (%SubobjectDestroy.WithSelf.Op.30f1ee.2), @SubobjectDestroy [concrete]
|
|
// CHECK:STDOUT: %SubobjectDestroy.facet.f61: %SubobjectDestroy.type = facet_value %D, (%custom_witness.b80ef6.2) [concrete]
|
|
// CHECK:STDOUT: %DestroyImpl.impl_witness.30f: <witness> = impl_witness imports.%DestroyImpl.impl_witness_table, @T.as_type.as.DestroyImpl.impl(%SubobjectDestroy.facet.f61) [concrete]
|
|
// CHECK:STDOUT: %Destroy.facet.448: %Destroy.type = facet_value %D, (%DestroyImpl.impl_witness.30f, %custom_witness.b80ef6.2) [concrete]
|
|
// CHECK:STDOUT: %SubobjectDestroy.WithSelf.Op.type.6870fd.4: type = fn_type @SubobjectDestroy.WithSelf.Op.loc20_32.4 [concrete]
|
|
// CHECK:STDOUT: %SubobjectDestroy.WithSelf.Op.30f1ee.4: %SubobjectDestroy.WithSelf.Op.type.6870fd.4 = struct_value () [concrete]
|
|
// CHECK:STDOUT: %custom_witness.b80ef6.4: <witness> = custom_witness (%SubobjectDestroy.WithSelf.Op.30f1ee.4), @SubobjectDestroy [concrete]
|
|
// CHECK:STDOUT: %SubobjectDestroy.facet.d79: %SubobjectDestroy.type = facet_value %C.10f, (%custom_witness.b80ef6.4) [concrete]
|
|
// CHECK:STDOUT: %DestroyImpl.impl_witness.0a0: <witness> = impl_witness imports.%DestroyImpl.impl_witness_table, @T.as_type.as.DestroyImpl.impl(%SubobjectDestroy.facet.d79) [concrete]
|
|
// CHECK:STDOUT: %Destroy.facet.81d: %Destroy.type = facet_value %C.10f, (%DestroyImpl.impl_witness.0a0, %custom_witness.b80ef6.4) [concrete]
|
|
// CHECK:STDOUT: %C.val.a4f: %C.10f = struct_value (%D.val) [concrete]
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: imports {
|
|
// CHECK:STDOUT: %Core.import_ref.74d: @T.as_type.as.DestroyImpl.impl.%T.as_type.as.DestroyImpl.impl.Op.type (%T.as_type.as.DestroyImpl.impl.Op.type.dea) = import_ref Core//prelude/parts/destroy, loc{{\d+_\d+}}, loaded [symbolic = @T.as_type.as.DestroyImpl.impl.%T.as_type.as.DestroyImpl.impl.Op (constants.%T.as_type.as.DestroyImpl.impl.Op.6e5)]
|
|
// CHECK:STDOUT: %DestroyImpl.impl_witness_table = impl_witness_table (%Core.import_ref.74d), @T.as_type.as.DestroyImpl.impl [concrete]
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: file {
|
|
// CHECK:STDOUT: %Make.decl: %Make.type = fn_decl @Make [concrete = constants.%Make] {
|
|
// CHECK:STDOUT: %T.patt.loc15_18.1: %pattern_type.5d7 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc15_18.2 (constants.%T.patt.4a7)]
|
|
// CHECK:STDOUT: %t.param_patt.loc15_31.1: @Make.%pattern_type.loc15_31 (%pattern_type.cab) = value_param_pattern [symbolic = %t.param_patt.loc15_31.2 (constants.%t.param_patt.571)]
|
|
// CHECK:STDOUT: %t.patt.loc15_31.1: @Make.%pattern_type.loc15_31 (%pattern_type.cab) = wrapper_binding_pattern t, %t.param_patt.loc15_31.1 [symbolic = %t.patt.loc15_31.2 (constants.%t.patt.a08)]
|
|
// CHECK:STDOUT: %d.param_patt: %pattern_type.d8d = value_param_pattern [concrete = constants.%d.param_patt]
|
|
// CHECK:STDOUT: %d.patt: %pattern_type.d8d = wrapper_binding_pattern d, %d.param_patt [concrete = constants.%d.patt]
|
|
// CHECK:STDOUT: %.loc15_41: %pattern_type.d8d = default_value_pattern %d.patt, %.loc15_46.2 [concrete = constants.%.ec6]
|
|
// CHECK:STDOUT: %return.param_patt.loc15_58.1: @Make.%pattern_type.loc15_58 (%pattern_type.aa1) = out_param_pattern [symbolic = %return.param_patt.loc15_58.2 (constants.%return.param_patt.c22)]
|
|
// CHECK:STDOUT: %return.patt.loc15_52.1: @Make.%pattern_type.loc15_58 (%pattern_type.aa1) = return_slot_pattern %return.param_patt.loc15_58.1, %C.loc15_58.2 [symbolic = %return.patt.loc15_52.2 (constants.%return.patt.a2c)]
|
|
// CHECK:STDOUT: } {
|
|
// CHECK:STDOUT: %.loc15_44: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct]
|
|
// CHECK:STDOUT: %D.ref.loc15_49: type = name_ref D, file.%D.decl [concrete = constants.%D]
|
|
// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct]
|
|
// CHECK:STDOUT: %.loc15_46.1: %D = as_compatible %empty_struct [concrete = constants.%D.val]
|
|
// CHECK:STDOUT: %.loc15_46.2: %D = converted %.loc15_44, %.loc15_46.1 [concrete = constants.%D.val]
|
|
// CHECK:STDOUT: %C.ref.loc15: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic]
|
|
// CHECK:STDOUT: %T.ref.loc15_57: %Z.type = name_ref T, %T.loc15_18.2 [symbolic = %T.loc15_18.1 (constants.%T.013)]
|
|
// CHECK:STDOUT: %C.loc15_58.2: type = class_type @C, @C(constants.%T.013) [symbolic = %C.loc15_58.1 (constants.%C.ccf)]
|
|
// CHECK:STDOUT: %.loc15_58.3: Core.Form = init_form %C.loc15_58.2 [symbolic = %.loc15_58.2 (constants.%.20e)]
|
|
// CHECK:STDOUT: %.loc15_20: type = splice_block %Z.ref [concrete = constants.%Z.type] {
|
|
// CHECK:STDOUT: %.Self.frozen: type = symbolic_binding .Self [symbolic_self = constants.%.Self.frozen]
|
|
// CHECK:STDOUT: %Z.ref: type = name_ref Z, file.%Z.decl [concrete = constants.%Z.type]
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: %T.loc15_18.2: %Z.type = symbolic_binding T, 0 [symbolic = %T.loc15_18.1 (constants.%T.013)]
|
|
// CHECK:STDOUT: %t.param: @Make.%T.as_type.loc15_33.1 (%T.as_type.ff1) = value_param call_param0
|
|
// CHECK:STDOUT: %.loc15_33.1: type = splice_block %.loc15_33.2 [symbolic = %T.as_type.loc15_33.1 (constants.%T.as_type.ff1)] {
|
|
// CHECK:STDOUT: %T.ref.loc15_33: %Z.type = name_ref T, %T.loc15_18.2 [symbolic = %T.loc15_18.1 (constants.%T.013)]
|
|
// CHECK:STDOUT: %T.as_type.loc15_33.2: type = facet_access_type %T.ref.loc15_33 [symbolic = %T.as_type.loc15_33.1 (constants.%T.as_type.ff1)]
|
|
// CHECK:STDOUT: %.loc15_33.2: type = converted %T.ref.loc15_33, %T.as_type.loc15_33.2 [symbolic = %T.as_type.loc15_33.1 (constants.%T.as_type.ff1)]
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: %t: @Make.%T.as_type.loc15_33.1 (%T.as_type.ff1) = wrapper_binding t, %t.param
|
|
// CHECK:STDOUT: %d.param: %D = value_param call_param1
|
|
// CHECK:STDOUT: %D.ref.loc15_39: type = name_ref D, file.%D.decl [concrete = constants.%D]
|
|
// CHECK:STDOUT: %d: %D = wrapper_binding d, %d.param
|
|
// CHECK:STDOUT: %return.param: ref @Make.%C.loc15_58.1 (%C.ccf) = out_param call_param2
|
|
// CHECK:STDOUT: %return: ref @Make.%C.loc15_58.1 (%C.ccf) = return_slot %return.param
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {} {}
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: generic fn @Make(%T.loc15_18.2: %Z.type) {
|
|
// CHECK:STDOUT: %T.patt.loc15_18.2: %pattern_type.5d7 = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc15_18.2 (constants.%T.patt.4a7)]
|
|
// CHECK:STDOUT: %T.loc15_18.1: %Z.type = symbolic_binding T, 0 [symbolic = %T.loc15_18.1 (constants.%T.013)]
|
|
// CHECK:STDOUT: %T.as_type.loc15_33.1: type = facet_access_type %T.loc15_18.1 [symbolic = %T.as_type.loc15_33.1 (constants.%T.as_type.ff1)]
|
|
// CHECK:STDOUT: %pattern_type.loc15_31: type = pattern_type %T.as_type.loc15_33.1 [symbolic = %pattern_type.loc15_31 (constants.%pattern_type.cab)]
|
|
// CHECK:STDOUT: %t.param_patt.loc15_31.2: @Make.%pattern_type.loc15_31 (%pattern_type.cab) = value_param_pattern [symbolic = %t.param_patt.loc15_31.2 (constants.%t.param_patt.571)]
|
|
// CHECK:STDOUT: %t.patt.loc15_31.2: @Make.%pattern_type.loc15_31 (%pattern_type.cab) = wrapper_binding_pattern t, %t.param_patt.loc15_31.2 [symbolic = %t.patt.loc15_31.2 (constants.%t.patt.a08)]
|
|
// CHECK:STDOUT: %C.loc15_58.1: type = class_type @C, @C(%T.loc15_18.1) [symbolic = %C.loc15_58.1 (constants.%C.ccf)]
|
|
// CHECK:STDOUT: %.loc15_58.2: Core.Form = init_form %C.loc15_58.1 [symbolic = %.loc15_58.2 (constants.%.20e)]
|
|
// CHECK:STDOUT: %pattern_type.loc15_58: type = pattern_type %C.loc15_58.1 [symbolic = %pattern_type.loc15_58 (constants.%pattern_type.aa1)]
|
|
// CHECK:STDOUT: %return.param_patt.loc15_58.2: @Make.%pattern_type.loc15_58 (%pattern_type.aa1) = out_param_pattern [symbolic = %return.param_patt.loc15_58.2 (constants.%return.param_patt.c22)]
|
|
// CHECK:STDOUT: %return.patt.loc15_52.2: @Make.%pattern_type.loc15_58 (%pattern_type.aa1) = return_slot_pattern %return.param_patt.loc15_58.2, %C.loc15_58.1 [symbolic = %return.patt.loc15_52.2 (constants.%return.patt.a2c)]
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: !definition:
|
|
// CHECK:STDOUT: %require_complete.loc15_31: <witness> = require_complete_type %T.as_type.loc15_33.1 [symbolic = %require_complete.loc15_31 (constants.%require_complete.e12)]
|
|
// CHECK:STDOUT: %require_complete.loc15_52: <witness> = require_complete_type %C.loc15_58.1 [symbolic = %require_complete.loc15_52 (constants.%require_complete.f24)]
|
|
// CHECK:STDOUT: %C.val: @Make.%C.loc15_58.1 (%C.ccf) = struct_value (constants.%D.val) [symbolic = %C.val (constants.%C.val.e90)]
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn(%t.param: @Make.%T.as_type.loc15_33.1 (%T.as_type.ff1), %d.param: %D) -> out %return.param: @Make.%C.loc15_58.1 (%C.ccf) {
|
|
// CHECK:STDOUT: !entry:
|
|
// CHECK:STDOUT: %d.ref: %D = name_ref d, %d
|
|
// CHECK:STDOUT: %.loc16_17.1: %struct_type.d.67c = struct_literal (%d.ref)
|
|
// CHECK:STDOUT: %C.ref.loc16: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic]
|
|
// CHECK:STDOUT: %T.ref.loc16: %Z.type = name_ref T, %T.loc15_18.2 [symbolic = %T.loc15_18.1 (constants.%T.013)]
|
|
// CHECK:STDOUT: %C.loc16: type = class_type @C, @C(constants.%T.013) [symbolic = %C.loc15_58.1 (constants.%C.ccf)]
|
|
// CHECK:STDOUT: %.loc16_17.2: %empty_struct_type = as_compatible %d.ref
|
|
// CHECK:STDOUT: %.loc15_58.1: ref @Make.%C.loc15_58.1 (%C.ccf) = splice_block %return.param {}
|
|
// CHECK:STDOUT: %.loc16_17.3: ref %D = class_element_access %.loc15_58.1, element0
|
|
// CHECK:STDOUT: %.loc16_17.4: ref %empty_struct_type = as_compatible %.loc16_17.3
|
|
// CHECK:STDOUT: %.loc16_17.5: init %empty_struct_type to %.loc16_17.4 = struct_init () [concrete = constants.%empty_struct]
|
|
// CHECK:STDOUT: %.loc16_17.6: init %D = as_compatible %.loc16_17.5 [concrete = constants.%D.val]
|
|
// CHECK:STDOUT: %.loc16_17.7: init %D = converted %d.ref, %.loc16_17.6 [concrete = constants.%D.val]
|
|
// CHECK:STDOUT: %.loc16_17.8: init %D to %.loc16_17.3 = in_place_init %.loc16_17.7 [concrete = constants.%D.val]
|
|
// CHECK:STDOUT: %.loc16_17.9: init @Make.%C.loc15_58.1 (%C.ccf) to %.loc15_58.1 = class_init (%.loc16_17.8) [symbolic = %C.val (constants.%C.val.e90)]
|
|
// CHECK:STDOUT: %.loc16_19: init @Make.%C.loc15_58.1 (%C.ccf) = converted %.loc16_17.1, %.loc16_17.9 [symbolic = %C.val (constants.%C.val.e90)]
|
|
// CHECK:STDOUT: return %.loc16_19 to %return.param
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn @G() {
|
|
// CHECK:STDOUT: !entry:
|
|
// CHECK:STDOUT: %Make.ref: %Make.type = name_ref Make, file.%Make.decl [concrete = constants.%Make]
|
|
// CHECK:STDOUT: %E.ref.loc20_22: type = name_ref E, file.%E.decl [concrete = constants.%E]
|
|
// CHECK:STDOUT: %.loc20_26: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct]
|
|
// CHECK:STDOUT: %E.ref.loc20_31: type = name_ref E, file.%E.decl [concrete = constants.%E]
|
|
// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete = constants.%empty_struct]
|
|
// CHECK:STDOUT: %.loc20_28.1: %E = as_compatible %empty_struct [concrete = constants.%E.val]
|
|
// CHECK:STDOUT: %.loc20_28.2: %E = converted %.loc20_26, %.loc20_28.1 [concrete = constants.%E.val]
|
|
// CHECK:STDOUT: %Z.facet.loc20_32.1: %Z.type = facet_value %E.ref.loc20_22, (constants.%Z.impl_witness) [concrete = constants.%Z.facet]
|
|
// CHECK:STDOUT: %.loc20_32.1: %Z.type = converted %E.ref.loc20_22, %Z.facet.loc20_32.1 [concrete = constants.%Z.facet]
|
|
// CHECK:STDOUT: %Z.facet.loc20_32.2: %Z.type = facet_value constants.%E, (constants.%Z.impl_witness) [concrete = constants.%Z.facet]
|
|
// CHECK:STDOUT: %.loc20_32.2: %Z.type = converted constants.%E, %Z.facet.loc20_32.2 [concrete = constants.%Z.facet]
|
|
// CHECK:STDOUT: %Z.facet.loc20_32.3: %Z.type = facet_value constants.%E, (constants.%Z.impl_witness) [concrete = constants.%Z.facet]
|
|
// CHECK:STDOUT: %.loc20_32.3: %Z.type = converted constants.%E, %Z.facet.loc20_32.3 [concrete = constants.%Z.facet]
|
|
// CHECK:STDOUT: %Make.specific_fn: <specific function> = specific_function %Make.ref, @Make(constants.%Z.facet) [concrete = constants.%Make.specific_fn]
|
|
// CHECK:STDOUT: %.loc20_32.4: ref %C.10f = temporary_storage
|
|
// CHECK:STDOUT: %Make.call: init %C.10f to %.loc20_32.4 = call %Make.specific_fn(%.loc20_28.2, @Make.%.loc15_46.2)
|
|
// CHECK:STDOUT: %.loc20_32.5: ref %C.10f = temporary %.loc20_32.4, %Make.call
|
|
// CHECK:STDOUT: %.loc20_32.6: %C.10f = acquire_value %.loc20_32.5
|
|
// CHECK:STDOUT: %.loc20_13.1: type = splice_block %C [concrete = constants.%C.10f] {
|
|
// CHECK:STDOUT: %C.ref: %C.type = name_ref C, file.%C.decl [concrete = constants.%C.generic]
|
|
// CHECK:STDOUT: %E.ref.loc20_12: type = name_ref E, file.%E.decl [concrete = constants.%E]
|
|
// CHECK:STDOUT: %Z.facet.loc20_13: %Z.type = facet_value %E.ref.loc20_12, (constants.%Z.impl_witness) [concrete = constants.%Z.facet]
|
|
// CHECK:STDOUT: %.loc20_13.2: %Z.type = converted %E.ref.loc20_12, %Z.facet.loc20_13 [concrete = constants.%Z.facet]
|
|
// CHECK:STDOUT: %C: type = class_type @C, @C(constants.%Z.facet) [concrete = constants.%C.10f]
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: %_: %C.10f = wrapper_binding _, %.loc20_32.6
|
|
// CHECK:STDOUT: name_binding_decl {
|
|
// CHECK:STDOUT: %_.patt: %pattern_type.b01 = value_binding_pattern _ [concrete = constants.%_.patt]
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT: %Destroy.facet.loc20_32.1: %Destroy.type = facet_value constants.%C.10f, (constants.%DestroyImpl.impl_witness.0a0, constants.%custom_witness.b80ef6.4) [concrete = constants.%Destroy.facet.81d]
|
|
// CHECK:STDOUT: %.loc20_32.7: %Destroy.type = converted constants.%C.10f, %Destroy.facet.loc20_32.1 [concrete = constants.%Destroy.facet.81d]
|
|
// CHECK:STDOUT: %Destroy.facet.loc20_32.2: %Destroy.type = facet_value constants.%C.10f, (constants.%DestroyImpl.impl_witness.0a0, constants.%custom_witness.b80ef6.4) [concrete = constants.%Destroy.facet.81d]
|
|
// CHECK:STDOUT: %.loc20_32.8: %Destroy.type = converted constants.%C.10f, %Destroy.facet.loc20_32.2 [concrete = constants.%Destroy.facet.81d]
|
|
// CHECK:STDOUT: <elided>
|
|
// CHECK:STDOUT: %SelfDestruct.call: init %empty_tuple.type = call %SelfDestruct.specific_fn(%.loc20_32.5)
|
|
// CHECK:STDOUT: return
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn @SubobjectDestroy.WithSelf.Op.loc20_32.1(%self.param: ref %empty_struct_type) = "no_op";
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn @SubobjectDestroy.WithSelf.Op.loc20_32.2(%self.param: ref %D) = "no_op";
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn @SubobjectDestroy.WithSelf.Op.loc20_32.3(%self.param: ref %struct_type.d.67c) {
|
|
// CHECK:STDOUT: !entry:
|
|
// CHECK:STDOUT: %.loc20_32.1: ref %D = struct_access %self.param, element0
|
|
// CHECK:STDOUT: %Destroy.facet.loc20_32.1: %Destroy.type = facet_value constants.%D, (constants.%DestroyImpl.impl_witness.30f, constants.%custom_witness.b80ef6.2) [concrete = constants.%Destroy.facet.448]
|
|
// CHECK:STDOUT: %.loc20_32.2: %Destroy.type = converted constants.%D, %Destroy.facet.loc20_32.1 [concrete = constants.%Destroy.facet.448]
|
|
// CHECK:STDOUT: %Destroy.facet.loc20_32.2: %Destroy.type = facet_value constants.%D, (constants.%DestroyImpl.impl_witness.30f, constants.%custom_witness.b80ef6.2) [concrete = constants.%Destroy.facet.448]
|
|
// CHECK:STDOUT: %.loc20_32.3: %Destroy.type = converted constants.%D, %Destroy.facet.loc20_32.2 [concrete = constants.%Destroy.facet.448]
|
|
// CHECK:STDOUT: <elided>
|
|
// CHECK:STDOUT: %SelfDestruct.call: init %empty_tuple.type = call %SelfDestruct.specific_fn(%.loc20_32.1)
|
|
// CHECK:STDOUT: return
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: fn @SubobjectDestroy.WithSelf.Op.loc20_32.4(%self.param: ref %C.10f) {
|
|
// CHECK:STDOUT: !entry:
|
|
// CHECK:STDOUT: %d.ref: %C.elem.a58 = name_ref d, @C.%field_decl [concrete = @C.%field_decl]
|
|
// CHECK:STDOUT: %.loc20_32.1: ref %D = class_element_access %self.param, element0
|
|
// CHECK:STDOUT: %Destroy.facet.loc20_32.1: %Destroy.type = facet_value constants.%D, (constants.%DestroyImpl.impl_witness.30f, constants.%custom_witness.b80ef6.2) [concrete = constants.%Destroy.facet.448]
|
|
// CHECK:STDOUT: %.loc20_32.2: %Destroy.type = converted constants.%D, %Destroy.facet.loc20_32.1 [concrete = constants.%Destroy.facet.448]
|
|
// CHECK:STDOUT: %Destroy.facet.loc20_32.2: %Destroy.type = facet_value constants.%D, (constants.%DestroyImpl.impl_witness.30f, constants.%custom_witness.b80ef6.2) [concrete = constants.%Destroy.facet.448]
|
|
// CHECK:STDOUT: %.loc20_32.3: %Destroy.type = converted constants.%D, %Destroy.facet.loc20_32.2 [concrete = constants.%Destroy.facet.448]
|
|
// CHECK:STDOUT: <elided>
|
|
// CHECK:STDOUT: %SelfDestruct.call: init %empty_tuple.type = call %SelfDestruct.specific_fn(%.loc20_32.1)
|
|
// CHECK:STDOUT: return
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: specific @Make(constants.%T.013) {
|
|
// CHECK:STDOUT: %T.patt.loc15_18.2 => constants.%T.patt.4a7
|
|
// CHECK:STDOUT: %T.loc15_18.1 => constants.%T.013
|
|
// CHECK:STDOUT: %T.as_type.loc15_33.1 => constants.%T.as_type.ff1
|
|
// CHECK:STDOUT: %pattern_type.loc15_31 => constants.%pattern_type.cab
|
|
// CHECK:STDOUT: %t.param_patt.loc15_31.2 => constants.%t.param_patt.571
|
|
// CHECK:STDOUT: %t.patt.loc15_31.2 => constants.%t.patt.a08
|
|
// CHECK:STDOUT: %C.loc15_58.1 => constants.%C.ccf
|
|
// CHECK:STDOUT: %.loc15_58.2 => constants.%.20e
|
|
// CHECK:STDOUT: %pattern_type.loc15_58 => constants.%pattern_type.aa1
|
|
// CHECK:STDOUT: %return.param_patt.loc15_58.2 => constants.%return.param_patt.c22
|
|
// CHECK:STDOUT: %return.patt.loc15_52.2 => constants.%return.patt.a2c
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: specific @Make(constants.%Z.facet) {
|
|
// CHECK:STDOUT: %T.patt.loc15_18.2 => constants.%T.patt.4a7
|
|
// CHECK:STDOUT: %T.loc15_18.1 => constants.%Z.facet
|
|
// CHECK:STDOUT: %T.as_type.loc15_33.1 => constants.%E
|
|
// CHECK:STDOUT: %pattern_type.loc15_31 => constants.%pattern_type.849
|
|
// CHECK:STDOUT: %t.param_patt.loc15_31.2 => constants.%t.param_patt.307
|
|
// CHECK:STDOUT: %t.patt.loc15_31.2 => constants.%t.patt.404
|
|
// CHECK:STDOUT: %C.loc15_58.1 => constants.%C.10f
|
|
// CHECK:STDOUT: %.loc15_58.2 => constants.%.c85
|
|
// CHECK:STDOUT: %pattern_type.loc15_58 => constants.%pattern_type.b01
|
|
// CHECK:STDOUT: %return.param_patt.loc15_58.2 => constants.%return.param_patt.a86
|
|
// CHECK:STDOUT: %return.patt.loc15_52.2 => constants.%return.patt.4c6
|
|
// CHECK:STDOUT:
|
|
// CHECK:STDOUT: !definition:
|
|
// CHECK:STDOUT: %require_complete.loc15_31 => constants.%complete_type.357
|
|
// CHECK:STDOUT: %require_complete.loc15_52 => constants.%complete_type.e41
|
|
// CHECK:STDOUT: %C.val => constants.%C.val.a4f
|
|
// CHECK:STDOUT: }
|
|
// CHECK:STDOUT:
|