diff --git a/toolchain/check/member_access.cpp b/toolchain/check/member_access.cpp index 5695a40df3da..0aafcf1fb499 100644 --- a/toolchain/check/member_access.cpp +++ b/toolchain/check/member_access.cpp @@ -318,7 +318,8 @@ static auto LookupMemberNameInScope(Context& context, SemIR::LocId loc_id, // Witness that `T` implements the `assoc_interface`. auto lookup_result = LookupImplWitness( - context, loc_id, context.constant_values().Get(base_id), + context, loc_id, + context.constant_values().Get(base_as_type.inst_id), EvalOrAddInst( context, loc_id, FacetTypeFromInterface(context, assoc_interface.interface_id, diff --git a/toolchain/check/testdata/facet/min_prelude/runtime_value.carbon b/toolchain/check/testdata/facet/min_prelude/runtime_value.carbon index abb5862bf2c8..036dddc48b0e 100644 --- a/toolchain/check/testdata/facet/min_prelude/runtime_value.carbon +++ b/toolchain/check/testdata/facet/min_prelude/runtime_value.carbon @@ -3,6 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // // INCLUDE-FILE: toolchain/testing/min_prelude/facet_types.carbon +// EXTRA-ARGS: --dump-sem-ir-ranges=only // // AUTOUPDATE // TIP: To test this file alone, run: @@ -22,7 +23,9 @@ class C { fn F(c: C) { // Member access produces a reference, which is copied into the value // binding. + //@dump-sem-ir-begin let a: I = c.i; + //@dump-sem-ir-end } // --- fail_todo_facet_copy_narrowing_from_reference.carbon @@ -38,92 +41,79 @@ class C { fn F(c: C) { // Member access produces a reference, which is copied into the value // binding. + // + // TODO: This copy should work, but the narrowing prevents it currently. + // + //@dump-sem-ir-begin // CHECK:STDERR: fail_todo_facet_copy_narrowing_from_reference.carbon:[[@LINE+4]]:14: error: semantics TODO: `conversion of runtime facet value` [SemanticsTodo] // CHECK:STDERR: let a: I = c.ij; // CHECK:STDERR: ^~~~ // CHECK:STDERR: let a: I = c.ij; + //@dump-sem-ir-end } -// --- fail_todo_member_lookup_in_runtime_value.carbon +// --- fail_compound_member_lookup_in_runtime_facet_without_value.carbon +library "[[@TEST_NAME]]"; -interface Z(T:! type) { +interface Z { let X:! type; } -class C {} - -final impl forall [T:! type] T as Z(C) where .X = () {} - -// CHECK:STDERR: fail_todo_member_lookup_in_runtime_value.carbon:[[@LINE+4]]:18: error: semantics TODO: `associated value lookup on runtime facet value` [SemanticsTodo] -// CHECK:STDERR: fn F(T: Z(C)) -> T.(Z(C).X) { -// CHECK:STDERR: ^~~~~~~~~~ +// CHECK:STDERR: fail_compound_member_lookup_in_runtime_facet_without_value.carbon:[[@LINE+4]]:15: error: semantics TODO: `associated value lookup on runtime facet value` [SemanticsTodo] +// CHECK:STDERR: fn F(T: Z, v: T.(Z.X)); +// CHECK:STDERR: ^~~~~~~ // CHECK:STDERR: -fn F(T: Z(C)) -> T.(Z(C).X) { - return (); +fn F(T: Z, v: T.(Z.X)); + +// --- fail_member_lookup_in_runtime_facet_without_value.carbon +library "[[@TEST_NAME]]"; + +interface Z { + let X:! type; } +// CHECK:STDERR: fail_member_lookup_in_runtime_facet_without_value.carbon:[[@LINE+4]]:15: error: cannot evaluate type expression [TypeExprEvaluationFailure] +// CHECK:STDERR: fn F(T: Z, v: T.X); +// CHECK:STDERR: ^~~ +// CHECK:STDERR: +fn F(T: Z, v: T.X); + +// --- fail_todo_compound_member_lookup_in_runtime_facet_with_value.carbon +library "[[@TEST_NAME]]"; + +interface Z { + let X:! type; +} + +// TODO: We should be able to get the value of `.X` from the `FacetType` of +// `T`. +// +// CHECK:STDERR: fail_todo_compound_member_lookup_in_runtime_facet_with_value.carbon:[[@LINE+4]]:29: error: semantics TODO: `conversion of runtime facet value` [SemanticsTodo] +// CHECK:STDERR: fn F(T: Z where .X = (), v: T.(Z.X)); +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: +fn F(T: Z where .X = (), v: T.(Z.X)); + +// --- fail_todo_member_lookup_in_runtime_facet_with_value.carbon +library "[[@TEST_NAME]]"; + +interface Z { + let X:! type; +} + +// TODO: We should be able to get the value of `.X` from the `FacetType` of +// `T`. +// +// CHECK:STDERR: fail_todo_member_lookup_in_runtime_facet_with_value.carbon:[[@LINE+4]]:29: error: cannot evaluate type expression [TypeExprEvaluationFailure] +// CHECK:STDERR: fn F(T: Z where .X = (), v: T.X); +// CHECK:STDERR: ^~~ +// CHECK:STDERR: +fn F(T: Z where .X = (), v: T.X); + // CHECK:STDOUT: --- facet_value_copy_from_reference.carbon // CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %I.type [concrete] -// CHECK:STDOUT: %struct_type.i: type = struct_type {.i: %I.type} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.i [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.2b5: type = pattern_type %I.type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.c48 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: %C = value_param call_param0 -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %c: %C = bind_name c, %c.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: witness = () -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: %.loc6: %C.elem = field_decl i, element0 [concrete] -// CHECK:STDOUT: %struct_type.i: type = struct_type {.i: %I.type} [concrete = constants.%struct_type.i] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.i [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .I = -// CHECK:STDOUT: .i = %.loc6 -// CHECK:STDOUT: } +// CHECK:STDOUT: file {} // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%c.param: %C) { // CHECK:STDOUT: !entry: @@ -132,113 +122,15 @@ fn F(T: Z(C)) -> T.(Z(C).X) { // CHECK:STDOUT: } // CHECK:STDOUT: %c.ref: %C = name_ref c, %c // CHECK:STDOUT: %i.ref: %C.elem = name_ref i, @C.%.loc6 [concrete = @C.%.loc6] -// CHECK:STDOUT: %.loc12_15.1: ref %I.type = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc12_15.2: %I.type = bind_value %.loc12_15.1 +// CHECK:STDOUT: %.loc13_15.1: ref %I.type = class_element_access %c.ref, element0 +// CHECK:STDOUT: %.loc13_15.2: %I.type = bind_value %.loc13_15.1 // CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: %a: %I.type = bind_name a, %.loc12_15.2 -// CHECK:STDOUT: return +// CHECK:STDOUT: %a: %I.type = bind_name a, %.loc13_15.2 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_facet_copy_narrowing_from_reference.carbon // CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] -// CHECK:STDOUT: %Self.826: %I.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %J.type: type = facet_type <@J> [concrete] -// CHECK:STDOUT: %Self.ccd: %J.type = bind_symbolic_name Self, 0 [symbolic] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %BitAnd.type: type = facet_type <@BitAnd> [concrete] -// CHECK:STDOUT: %Op.type.27a: type = fn_type @Op.1 [concrete] -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %Op.type.f99: type = fn_type @Op.2, @impl(%T) [symbolic] -// CHECK:STDOUT: %Op.05a: %Op.type.f99 = struct_value () [symbolic] -// CHECK:STDOUT: %BitAnd.impl_witness.0e5: = impl_witness imports.%BitAnd.impl_witness_table, @impl(type) [concrete] -// CHECK:STDOUT: %Op.type.eb8: type = fn_type @Op.2, @impl(type) [concrete] -// CHECK:STDOUT: %Op.444: %Op.type.eb8 = struct_value () [concrete] -// CHECK:STDOUT: %BitAnd.facet: %BitAnd.type = facet_value type, (%BitAnd.impl_witness.0e5) [concrete] -// CHECK:STDOUT: %.518: type = fn_type_with_self_type %Op.type.27a, %BitAnd.facet [concrete] -// CHECK:STDOUT: %Op.bound: = bound_method %I.type, %Op.444 [concrete] -// CHECK:STDOUT: %Op.specific_fn: = specific_function %Op.444, @Op.2(type) [concrete] -// CHECK:STDOUT: %bound_method: = bound_method %I.type, %Op.specific_fn [concrete] -// CHECK:STDOUT: %facet_type: type = facet_type <@I & @J> [concrete] -// CHECK:STDOUT: %C.elem: type = unbound_element_type %C, %facet_type [concrete] -// CHECK:STDOUT: %struct_type.ij: type = struct_type {.ij: %facet_type} [concrete] -// CHECK:STDOUT: %complete_type.559: = complete_type_witness %struct_type.ij [concrete] -// CHECK:STDOUT: %pattern_type.c48: type = pattern_type %C [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: %pattern_type.2b5: type = pattern_type %I.type [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: .BitAnd = %Core.BitAnd -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.BitAnd: type = import_ref Core//prelude, BitAnd, loaded [concrete = constants.%BitAnd.type] -// CHECK:STDOUT: %Core.import_ref.1e6: @impl.%Op.type (%Op.type.f99) = import_ref Core//prelude, loc22_42, loaded [symbolic = @impl.%Op (constants.%Op.05a)] -// CHECK:STDOUT: %BitAnd.impl_witness_table = impl_witness_table (%Core.import_ref.1e6), @impl [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .I = %I.decl -// CHECK:STDOUT: .J = %J.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} -// CHECK:STDOUT: %J.decl: type = interface_decl @J [concrete = constants.%J.type] {} {} -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %c.patt: %pattern_type.c48 = binding_pattern c [concrete] -// CHECK:STDOUT: %c.param_patt: %pattern_type.c48 = value_param_pattern %c.patt, call_param0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %c.param: %C = value_param call_param0 -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %c: %C = bind_name c, %c.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @I { -// CHECK:STDOUT: %Self: %I.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self.826] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: witness = () -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: interface @J { -// CHECK:STDOUT: %Self: %J.type = bind_symbolic_name Self, 0 [symbolic = constants.%Self.ccd] -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self -// CHECK:STDOUT: witness = () -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] -// CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [concrete = constants.%J.type] -// CHECK:STDOUT: %impl.elem0: %.518 = impl_witness_access constants.%BitAnd.impl_witness.0e5, element0 [concrete = constants.%Op.444] -// CHECK:STDOUT: %bound_method.loc7_13.1: = bound_method %I.ref, %impl.elem0 [concrete = constants.%Op.bound] -// CHECK:STDOUT: %specific_fn: = specific_function %impl.elem0, @Op.2(type) [concrete = constants.%Op.specific_fn] -// CHECK:STDOUT: %bound_method.loc7_13.2: = bound_method %I.ref, %specific_fn [concrete = constants.%bound_method] -// CHECK:STDOUT: %type.and: init type = call %bound_method.loc7_13.2(%I.ref, %J.ref) [concrete = constants.%facet_type] -// CHECK:STDOUT: %.loc7_13.1: type = value_of_initializer %type.and [concrete = constants.%facet_type] -// CHECK:STDOUT: %.loc7_13.2: type = converted %type.and, %.loc7_13.1 [concrete = constants.%facet_type] -// CHECK:STDOUT: %.loc7_9: %C.elem = field_decl ij, element0 [concrete] -// CHECK:STDOUT: %struct_type.ij: type = struct_type {.ij: %facet_type} [concrete = constants.%struct_type.ij] -// CHECK:STDOUT: %complete_type: = complete_type_witness %struct_type.ij [concrete = constants.%complete_type.559] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: .I = -// CHECK:STDOUT: .J = -// CHECK:STDOUT: .ij = %.loc7_9 -// CHECK:STDOUT: } +// CHECK:STDOUT: file {} // CHECK:STDOUT: // CHECK:STDOUT: fn @F(%c.param: %C) { // CHECK:STDOUT: !entry: @@ -247,185 +139,9 @@ fn F(T: Z(C)) -> T.(Z(C).X) { // CHECK:STDOUT: } // CHECK:STDOUT: %c.ref: %C = name_ref c, %c // CHECK:STDOUT: %ij.ref: %C.elem = name_ref ij, @C.%.loc7_9 [concrete = @C.%.loc7_9] -// CHECK:STDOUT: %.loc17_15.1: ref %facet_type = class_element_access %c.ref, element0 -// CHECK:STDOUT: %.loc17_15.2: %facet_type = bind_value %.loc17_15.1 +// CHECK:STDOUT: %.loc21_15.1: ref %facet_type = class_element_access %c.ref, element0 +// CHECK:STDOUT: %.loc21_15.2: %facet_type = bind_value %.loc21_15.1 // CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] // CHECK:STDOUT: %a: %I.type = bind_name a, -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: --- fail_todo_member_lookup_in_runtime_value.carbon -// CHECK:STDOUT: -// CHECK:STDOUT: constants { -// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic] -// CHECK:STDOUT: %pattern_type.98f: type = pattern_type type [concrete] -// CHECK:STDOUT: %Z.type.9fb: type = generic_interface_type @Z [concrete] -// CHECK:STDOUT: %empty_tuple.type: type = tuple_type () [concrete] -// CHECK:STDOUT: %Z.generic: %Z.type.9fb = struct_value () [concrete] -// CHECK:STDOUT: %Z.type.a61: type = facet_type <@Z, @Z(%T)> [symbolic] -// CHECK:STDOUT: %Self.2bc: %Z.type.a61 = bind_symbolic_name Self, 1 [symbolic] -// CHECK:STDOUT: %Z.assoc_type.26e: type = assoc_entity_type @Z, @Z(%T) [symbolic] -// CHECK:STDOUT: %assoc0.1cd: %Z.assoc_type.26e = assoc_entity element0, @Z.%X [symbolic] -// CHECK:STDOUT: %C: type = class_type @C [concrete] -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] -// CHECK:STDOUT: %Z.type.049: type = facet_type <@Z, @Z(%C)> [concrete] -// CHECK:STDOUT: %.Self: %Z.type.049 = bind_symbolic_name .Self [symbolic_self] -// CHECK:STDOUT: %Self.a38: %Z.type.049 = bind_symbolic_name Self, 1 [symbolic] -// CHECK:STDOUT: %Z.assoc_type.252: type = assoc_entity_type @Z, @Z(%C) [concrete] -// CHECK:STDOUT: %assoc0.ea4: %Z.assoc_type.252 = assoc_entity element0, @Z.%X [concrete] -// CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self [symbolic_self] -// CHECK:STDOUT: %Z.lookup_impl_witness: = lookup_impl_witness %.Self, @Z, @Z(%C) [symbolic_self] -// CHECK:STDOUT: %Z.facet: %Z.type.049 = facet_value %.Self.as_type, (%Z.lookup_impl_witness) [symbolic_self] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access %Z.lookup_impl_witness, element0 [symbolic_self] -// CHECK:STDOUT: %Z_where.type: type = facet_type <@Z, @Z(%C) where %impl.elem0 = %empty_tuple.type> [concrete] -// CHECK:STDOUT: %Z.impl_witness: = impl_witness file.%Z.impl_witness_table, @impl(%T) [symbolic] -// CHECK:STDOUT: %pattern_type.c1f: type = pattern_type %Z.type.049 [concrete] -// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] -// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: imports { -// CHECK:STDOUT: %Core: = namespace file.%Core.import, [concrete] { -// CHECK:STDOUT: import Core//prelude -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: file { -// CHECK:STDOUT: package: = namespace [concrete] { -// CHECK:STDOUT: .Core = imports.%Core -// CHECK:STDOUT: .Z = %Z.decl -// CHECK:STDOUT: .C = %C.decl -// CHECK:STDOUT: .F = %F.decl -// CHECK:STDOUT: } -// CHECK:STDOUT: %Core.import = import Core -// CHECK:STDOUT: %Z.decl: %Z.type.9fb = interface_decl @Z [concrete = constants.%Z.generic] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.loc2_13.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc2_13.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} -// CHECK:STDOUT: impl_decl @impl [concrete] { -// CHECK:STDOUT: %T.patt: %pattern_type.98f = symbolic_binding_pattern T, 0 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc8_20.1 [symbolic = %T.loc8_20.2 (constants.%T)] -// CHECK:STDOUT: %Z.ref: %Z.type.9fb = name_ref Z, file.%Z.decl [concrete = constants.%Z.generic] -// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %Z.type: type = facet_type <@Z, @Z(constants.%C)> [concrete = constants.%Z.type.049] -// CHECK:STDOUT: %.Self: %Z.type.049 = bind_symbolic_name .Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %.Self.ref: %Z.type.049 = name_ref .Self, %.Self [symbolic_self = constants.%.Self] -// CHECK:STDOUT: %.loc8_46.1: %Z.assoc_type.252 = specific_constant @X.%assoc0, @Z(constants.%C) [concrete = constants.%assoc0.ea4] -// CHECK:STDOUT: %X.ref: %Z.assoc_type.252 = name_ref X, %.loc8_46.1 [concrete = constants.%assoc0.ea4] -// CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.ref [symbolic_self = constants.%.Self.as_type] -// CHECK:STDOUT: %.loc8_46.2: type = converted %.Self.ref, %.Self.as_type [symbolic_self = constants.%.Self.as_type] -// CHECK:STDOUT: %impl.elem0: type = impl_witness_access constants.%Z.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0] -// CHECK:STDOUT: %.loc8_52.1: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: %.loc8_52.2: type = converted %.loc8_52.1, constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %.loc8_40: type = where_expr %.Self [concrete = constants.%Z_where.type] { -// CHECK:STDOUT: requirement_rewrite %impl.elem0, %.loc8_52.2 -// CHECK:STDOUT: } -// CHECK:STDOUT: %T.loc8_20.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_20.2 (constants.%T)] -// CHECK:STDOUT: } -// CHECK:STDOUT: %Z.impl_witness_table = impl_witness_table (%impl_witness_assoc_constant), @impl [concrete] -// CHECK:STDOUT: %Z.impl_witness: = impl_witness %Z.impl_witness_table, @impl(constants.%T) [symbolic = @impl.%Z.impl_witness (constants.%Z.impl_witness)] -// CHECK:STDOUT: %impl_witness_assoc_constant: type = impl_witness_assoc_constant constants.%empty_tuple.type [concrete = constants.%empty_tuple.type] -// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { -// CHECK:STDOUT: %T.patt: %pattern_type.c1f = binding_pattern T [concrete] -// CHECK:STDOUT: %T.param_patt: %pattern_type.c1f = value_param_pattern %T.patt, call_param0 [concrete] -// CHECK:STDOUT: %return.patt: = return_slot_pattern [concrete] -// CHECK:STDOUT: %return.param_patt: = out_param_pattern %return.patt, call_param1 [concrete] -// CHECK:STDOUT: } { -// CHECK:STDOUT: %T.ref: %Z.type.049 = name_ref T, %T -// CHECK:STDOUT: %Z.ref.loc14_21: %Z.type.9fb = name_ref Z, file.%Z.decl [concrete = constants.%Z.generic] -// CHECK:STDOUT: %C.ref.loc14_23: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %Z.type.loc14_24: type = facet_type <@Z, @Z(constants.%C)> [concrete = constants.%Z.type.049] -// CHECK:STDOUT: %.loc14_25: %Z.assoc_type.252 = specific_constant @X.%assoc0, @Z(constants.%C) [concrete = constants.%assoc0.ea4] -// CHECK:STDOUT: %X.ref: %Z.assoc_type.252 = name_ref X, %.loc14_25 [concrete = constants.%assoc0.ea4] -// CHECK:STDOUT: %T.param: %Z.type.049 = value_param call_param0 -// CHECK:STDOUT: %.loc14_12: type = splice_block %Z.type.loc14_12 [concrete = constants.%Z.type.049] { -// CHECK:STDOUT: %Z.ref.loc14_9: %Z.type.9fb = name_ref Z, file.%Z.decl [concrete = constants.%Z.generic] -// CHECK:STDOUT: %C.ref.loc14_11: type = name_ref C, file.%C.decl [concrete = constants.%C] -// CHECK:STDOUT: %Z.type.loc14_12: type = facet_type <@Z, @Z(constants.%C)> [concrete = constants.%Z.type.049] -// CHECK:STDOUT: } -// CHECK:STDOUT: %T: %Z.type.049 = bind_name T, %T.param -// CHECK:STDOUT: %return.param: ref = out_param call_param1 -// CHECK:STDOUT: %return: ref = return_slot %return.param -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic interface @Z(%T.loc2_13.1: type) { -// CHECK:STDOUT: %T.loc2_13.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc2_13.2 (constants.%T)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Z.type: type = facet_type <@Z, @Z(%T.loc2_13.2)> [symbolic = %Z.type (constants.%Z.type.a61)] -// CHECK:STDOUT: %Self.2: @Z.%Z.type (%Z.type.a61) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.2bc)] -// CHECK:STDOUT: %Z.assoc_type: type = assoc_entity_type @Z, @Z(%T.loc2_13.2) [symbolic = %Z.assoc_type (constants.%Z.assoc_type.26e)] -// CHECK:STDOUT: %assoc0: @Z.%Z.assoc_type (%Z.assoc_type.26e) = assoc_entity element0, %X [symbolic = %assoc0 (constants.%assoc0.1cd)] -// CHECK:STDOUT: -// CHECK:STDOUT: interface { -// CHECK:STDOUT: %Self.1: @Z.%Z.type (%Z.type.a61) = bind_symbolic_name Self, 1 [symbolic = %Self.2 (constants.%Self.2bc)] -// CHECK:STDOUT: %X: type = assoc_const_decl @X [concrete] { -// CHECK:STDOUT: %assoc0: @Z.%Z.assoc_type (%Z.assoc_type.26e) = assoc_entity element0, @Z.%X [symbolic = @Z.%assoc0 (constants.%assoc0.1cd)] -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = %Self.1 -// CHECK:STDOUT: .X = @X.%assoc0 -// CHECK:STDOUT: witness = (%X) -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic assoc_const @X(@Z.%T.loc2_13.1: type, @Z.%Self.1: @Z.%Z.type (%Z.type.a61)) { -// CHECK:STDOUT: assoc_const X:! type; -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: generic impl @impl(%T.loc8_20.1: type) { -// CHECK:STDOUT: %T.loc8_20.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc8_20.2 (constants.%T)] -// CHECK:STDOUT: %Z.impl_witness: = impl_witness file.%Z.impl_witness_table, @impl(%T.loc8_20.2) [symbolic = %Z.impl_witness (constants.%Z.impl_witness)] -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: -// CHECK:STDOUT: impl: %T.ref as %.loc8_40 { -// CHECK:STDOUT: !members: -// CHECK:STDOUT: witness = file.%Z.impl_witness -// CHECK:STDOUT: } -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: class @C { -// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete = constants.%empty_struct_type] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete = constants.%complete_type] -// CHECK:STDOUT: complete_type_witness = %complete_type -// CHECK:STDOUT: -// CHECK:STDOUT: !members: -// CHECK:STDOUT: .Self = constants.%C -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: fn @F(%T.param: %Z.type.049) -> { -// CHECK:STDOUT: !entry: -// CHECK:STDOUT: %.loc15: %empty_tuple.type = tuple_literal () -// CHECK:STDOUT: return -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Z(constants.%T) { -// CHECK:STDOUT: %T.loc2_13.2 => constants.%T -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%T, constants.%Self.2bc) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @Z(constants.%C) { -// CHECK:STDOUT: %T.loc2_13.2 => constants.%C -// CHECK:STDOUT: -// CHECK:STDOUT: !definition: -// CHECK:STDOUT: %Z.type => constants.%Z.type.049 -// CHECK:STDOUT: %Self.2 => constants.%Self.a38 -// CHECK:STDOUT: %Z.assoc_type => constants.%Z.assoc_type.252 -// CHECK:STDOUT: %assoc0 => constants.%assoc0.ea4 -// CHECK:STDOUT: } -// CHECK:STDOUT: -// CHECK:STDOUT: specific @X(constants.%C, constants.%Z.facet) {} -// CHECK:STDOUT: -// CHECK:STDOUT: specific @impl(constants.%T) { -// CHECK:STDOUT: %T.loc8_20.2 => constants.%T -// CHECK:STDOUT: %Z.impl_witness => constants.%Z.impl_witness // CHECK:STDOUT: } // CHECK:STDOUT: