diff --git a/toolchain/check/handle_binding_pattern.cpp b/toolchain/check/handle_binding_pattern.cpp index b413dbdd24ee..19c5a29dcfc7 100644 --- a/toolchain/check/handle_binding_pattern.cpp +++ b/toolchain/check/handle_binding_pattern.cpp @@ -366,13 +366,6 @@ auto HandleParseNode(Context& context, // add a proper diagnostic. context.TODO(node_id, "_ used as associated constant name"); } - cast_type_id = AsCompleteType(context, cast_type_id, type_node, [&] { - CARBON_DIAGNOSTIC(IncompleteTypeInAssociatedConstantDecl, Error, - "associated constant has incomplete type {0}", - SemIR::TypeId); - return context.emitter().Build( - type_node, IncompleteTypeInAssociatedConstantDecl, cast_type_id); - }); SemIR::AssociatedConstantDecl assoc_const_decl = { .type_id = cast_type_id, diff --git a/toolchain/check/testdata/facet/facet_assoc_const.carbon b/toolchain/check/testdata/facet/facet_assoc_const.carbon index 431b918967a0..466ef6064b7e 100644 --- a/toolchain/check/testdata/facet/facet_assoc_const.carbon +++ b/toolchain/check/testdata/facet/facet_assoc_const.carbon @@ -471,76 +471,39 @@ interface N { fn F(T:! N where .Y1 = () and .Y2 = .Y1 and .Y2 = .Self.Y1) { } -// --- fail_todo_cycle_through_self_reference.carbon +// --- fail_cycle_through_self_reference.carbon library "[[@TEST_NAME]]"; interface Z { let T:! type; - // TODO: This should not be an error. - // - // CHECK:STDERR: fail_todo_cycle_through_self_reference.carbon:[[@LINE+7]]:11: error: associated constant has incomplete type `Z` [IncompleteTypeInAssociatedConstantDecl] - // CHECK:STDERR: let U:! Z; - // CHECK:STDERR: ^ - // CHECK:STDERR: fail_todo_cycle_through_self_reference.carbon:[[@LINE-7]]:1: note: interface is currently being defined [InterfaceIncompleteWithinDefinition] - // CHECK:STDERR: interface Z { - // CHECK:STDERR: ^~~~~~~~~~~~~ - // CHECK:STDERR: let U:! Z; } -// TODO: Should be diagnosed as a cycle. +// CHECK:STDERR: fail_cycle_through_self_reference.carbon:[[@LINE+4]]:10: error: found cycle in facet type constraint for `.(Z.T)` [FacetTypeConstraintCycle] +// CHECK:STDERR: fn F(A:! Z where .T = .U.T and .U = .Self) {} +// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// CHECK:STDERR: fn F(A:! Z where .T = .U.T and .U = .Self) {} -// --- fail_todo_reference_same_constant_in_different_self.carbon +// --- reference_same_constant_in_different_self.carbon library "[[@TEST_NAME]]"; interface Z { let T:! type; - // TODO: This should not be an error. - // - // CHECK:STDERR: fail_todo_reference_same_constant_in_different_self.carbon:[[@LINE+7]]:11: error: associated constant has incomplete type `Z` [IncompleteTypeInAssociatedConstantDecl] - // CHECK:STDERR: let U:! Z; - // CHECK:STDERR: ^ - // CHECK:STDERR: fail_todo_reference_same_constant_in_different_self.carbon:[[@LINE-7]]:1: note: interface is currently being defined [InterfaceIncompleteWithinDefinition] - // CHECK:STDERR: interface Z { - // CHECK:STDERR: ^~~~~~~~~~~~~ - // CHECK:STDERR: let U:! Z; } -// TODO: Should not be diagnosed as a cycle, once the incorrect failure above is -// fixed. fn F(A:! Z where .T = (), B:! Z where .T = .U.T and .U = A) {} -// --- fail_todo_non_cycle_with_self_reference.carbon +// --- non_cycle_with_self_reference.carbon library "[[@TEST_NAME]]"; interface Z { - // TODO: This should not be an error. - // - // CHECK:STDERR: fail_todo_non_cycle_with_self_reference.carbon:[[@LINE+7]]:11: error: associated constant has incomplete type `Z` [IncompleteTypeInAssociatedConstantDecl] - // CHECK:STDERR: let T:! Z; - // CHECK:STDERR: ^ - // CHECK:STDERR: fail_todo_non_cycle_with_self_reference.carbon:[[@LINE-6]]:1: note: interface is currently being defined [InterfaceIncompleteWithinDefinition] - // CHECK:STDERR: interface Z { - // CHECK:STDERR: ^~~~~~~~~~~~~ - // CHECK:STDERR: - let T:! Z; + let T:! type; let U:! type; - // TODO: This should not be an error. - // - // CHECK:STDERR: fail_todo_non_cycle_with_self_reference.carbon:[[@LINE+7]]:11: error: associated constant has incomplete type `Z` [IncompleteTypeInAssociatedConstantDecl] - // CHECK:STDERR: let V:! Z; - // CHECK:STDERR: ^ - // CHECK:STDERR: fail_todo_non_cycle_with_self_reference.carbon:[[@LINE-17]]:1: note: interface is currently being defined [InterfaceIncompleteWithinDefinition] - // CHECK:STDERR: interface Z { - // CHECK:STDERR: ^~~~~~~~~~~~~ - // CHECK:STDERR: let V:! Z; } -// TODO: Should not be diagnosed as a cycle, once the incorrect failure above is -// fixed. fn F(A:! Z where .T = .V.U and .V = .Self and .U = ()) -> A.T { return (); } diff --git a/toolchain/check/testdata/facet/validate_rewrite_constraints.carbon b/toolchain/check/testdata/facet/validate_rewrite_constraints.carbon index 03fe5813a30e..9a24b24e7431 100644 --- a/toolchain/check/testdata/facet/validate_rewrite_constraints.carbon +++ b/toolchain/check/testdata/facet/validate_rewrite_constraints.carbon @@ -698,25 +698,16 @@ fn G(U:! I where .X1 = {} and .X2 = (), T:! I where .X1 = U.X2 and .X2 = {}) { F(U, T); } -// --- fail_todo_value_through_self_value.carbon +// --- value_through_self_value.carbon library "[[@TEST_NAME]]"; interface I { - // TODO: This should not be diagnosed. - // - // CHECK:STDERR: fail_todo_value_through_self_value.carbon:[[@LINE+7]]:12: error: associated constant has incomplete type `I` [IncompleteTypeInAssociatedConstantDecl] - // CHECK:STDERR: let X1:! I; - // CHECK:STDERR: ^ - // CHECK:STDERR: fail_todo_value_through_self_value.carbon:[[@LINE-6]]:1: note: interface is currently being defined [InterfaceIncompleteWithinDefinition] - // CHECK:STDERR: interface I { - // CHECK:STDERR: ^~~~~~~~~~~~~ - // CHECK:STDERR: let X1:! I; let X2:! type; let X3:! type; } -fn F(T:! I where .X1 = .Self and .X2 = .X1.X3 and .X3 = ()); +fn F(T:! I where .X1 = .Self and .X2 = .X1.X3 and .X3 = ()) {} fn G(T:! I where .X1 = .Self and .X2 = () and .X3 = ()) { F(T); diff --git a/toolchain/check/testdata/impl/assoc_const_self.carbon b/toolchain/check/testdata/impl/assoc_const_self.carbon index be1bdeaf6bc6..6879706cac1f 100644 --- a/toolchain/check/testdata/impl/assoc_const_self.carbon +++ b/toolchain/check/testdata/impl/assoc_const_self.carbon @@ -106,7 +106,6 @@ fn CallF() { // CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] // CHECK:STDOUT: %Self.ab9: %I.type = symbolic_binding Self, 0 [symbolic] // CHECK:STDOUT: %Self.binding.as_type.d31: type = symbolic_binding_type Self, 0, %Self.ab9 [symbolic] -// CHECK:STDOUT: %require_complete.4df: = require_complete_type %Self.binding.as_type.d31 [symbolic] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] // CHECK:STDOUT: %assoc0.8a1: %I.assoc_type = assoc_entity element0, @I.%V [concrete] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] @@ -114,12 +113,10 @@ fn CallF() { // CHECK:STDOUT: %.Self: %I.type = symbolic_binding .Self [symbolic_self] // CHECK:STDOUT: %.Self.binding.as_type: type = symbolic_binding_type .Self, %.Self [symbolic_self] // CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %.Self, @I [symbolic_self] -// CHECK:STDOUT: %require_complete.716: = require_complete_type %.Self.binding.as_type [symbolic_self] // CHECK:STDOUT: %impl.elem0: %.Self.binding.as_type = impl_witness_access %I.lookup_impl_witness, element0 [symbolic_self] // CHECK:STDOUT: %I_where.type.ec3: type = facet_type <@I where %impl.elem0 = %empty_struct> [concrete] // CHECK:STDOUT: %I.impl_witness.df7: = impl_witness @empty_struct_type.as.I.impl.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet.47f: %I.type = facet_value %empty_struct_type, (%I.impl_witness.df7) [concrete] -// CHECK:STDOUT: %complete_type.357: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %int_32: Core.IntLiteral = int_value 32 [concrete] // CHECK:STDOUT: %Int.type: type = generic_class_type @Int [concrete] // CHECK:STDOUT: %Int.generic: %Int.type = struct_value () [concrete] @@ -128,8 +125,6 @@ fn CallF() { // CHECK:STDOUT: %I_where.type.b52: type = facet_type <@I where %impl.elem0 = %int_0.5c6> [concrete] // CHECK:STDOUT: %I.impl_witness.550: = impl_witness @i32.as.I.impl.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet.608: %I.type = facet_value %i32, (%I.impl_witness.550) [concrete] -// CHECK:STDOUT: %i32.builtin: type = int_type signed, %int_32 [concrete] -// CHECK:STDOUT: %complete_type.f8a: = complete_type_witness %i32.builtin [concrete] // CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] // CHECK:STDOUT: %ImplicitAs.type.e8c: type = facet_type <@ImplicitAs, @ImplicitAs(%i32)> [concrete] @@ -221,7 +216,6 @@ fn CallF() { // CHECK:STDOUT: generic assoc_const @V(@I.%Self: %I.type) { // CHECK:STDOUT: %Self: %I.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.ab9)] // CHECK:STDOUT: %Self.binding.as_type: type = symbolic_binding_type Self, 0, %Self [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.d31)] -// CHECK:STDOUT: %require_complete: = require_complete_type %Self.binding.as_type [symbolic = %require_complete (constants.%require_complete.4df)] // CHECK:STDOUT: // CHECK:STDOUT: assoc_const V:! @V.%Self.binding.as_type (%Self.binding.as_type.d31); // CHECK:STDOUT: } @@ -254,25 +248,21 @@ fn CallF() { // CHECK:STDOUT: specific @V(constants.%Self.ab9) { // CHECK:STDOUT: %Self => constants.%Self.ab9 // CHECK:STDOUT: %Self.binding.as_type => constants.%Self.binding.as_type.d31 -// CHECK:STDOUT: %require_complete => constants.%require_complete.4df // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @V(constants.%.Self) { // CHECK:STDOUT: %Self => constants.%.Self // CHECK:STDOUT: %Self.binding.as_type => constants.%.Self.binding.as_type -// CHECK:STDOUT: %require_complete => constants.%require_complete.716 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @V(constants.%I.facet.47f) { // CHECK:STDOUT: %Self => constants.%I.facet.47f // CHECK:STDOUT: %Self.binding.as_type => constants.%empty_struct_type -// CHECK:STDOUT: %require_complete => constants.%complete_type.357 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @V(constants.%I.facet.608) { // CHECK:STDOUT: %Self => constants.%I.facet.608 // CHECK:STDOUT: %Self.binding.as_type => constants.%i32 -// CHECK:STDOUT: %require_complete => constants.%complete_type.f8a // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_assoc_const_mismatch.carbon @@ -281,7 +271,6 @@ fn CallF() { // CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] // CHECK:STDOUT: %Self.ab9: %I.type = symbolic_binding Self, 0 [symbolic] // CHECK:STDOUT: %Self.binding.as_type.d31: type = symbolic_binding_type Self, 0, %Self.ab9 [symbolic] -// CHECK:STDOUT: %require_complete.4df: = require_complete_type %Self.binding.as_type.d31 [symbolic] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] // CHECK:STDOUT: %assoc0.8a1: %I.assoc_type = assoc_entity element0, @I.%V [concrete] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] @@ -289,13 +278,11 @@ fn CallF() { // CHECK:STDOUT: %.Self: %I.type = symbolic_binding .Self [symbolic_self] // CHECK:STDOUT: %.Self.binding.as_type: type = symbolic_binding_type .Self, %.Self [symbolic_self] // CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %.Self, @I [symbolic_self] -// CHECK:STDOUT: %require_complete.716: = require_complete_type %.Self.binding.as_type [symbolic_self] // CHECK:STDOUT: %impl.elem0: %.Self.binding.as_type = impl_witness_access %I.lookup_impl_witness, element0 [symbolic_self] // CHECK:STDOUT: %int_0: Core.IntLiteral = int_value 0 [concrete] // CHECK:STDOUT: %I_where.type: type = facet_type <@I where %impl.elem0 = %int_0> [concrete] // CHECK:STDOUT: %I.impl_witness: = impl_witness @empty_struct_type.as.I.impl.%I.impl_witness_table [concrete] // CHECK:STDOUT: %I.facet: %I.type = facet_value %empty_struct_type, (%I.impl_witness) [concrete] -// CHECK:STDOUT: %complete_type: = complete_type_witness %empty_struct_type [concrete] // CHECK:STDOUT: %ImplicitAs.type.cc7: type = generic_interface_type @ImplicitAs [concrete] // CHECK:STDOUT: %ImplicitAs.generic: %ImplicitAs.type.cc7 = struct_value () [concrete] // CHECK:STDOUT: } @@ -351,7 +338,6 @@ fn CallF() { // CHECK:STDOUT: generic assoc_const @V(@I.%Self: %I.type) { // CHECK:STDOUT: %Self: %I.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.ab9)] // CHECK:STDOUT: %Self.binding.as_type: type = symbolic_binding_type Self, 0, %Self [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.d31)] -// CHECK:STDOUT: %require_complete: = require_complete_type %Self.binding.as_type [symbolic = %require_complete (constants.%require_complete.4df)] // CHECK:STDOUT: // CHECK:STDOUT: assoc_const V:! @V.%Self.binding.as_type (%Self.binding.as_type.d31); // CHECK:STDOUT: } @@ -369,19 +355,16 @@ fn CallF() { // CHECK:STDOUT: specific @V(constants.%Self.ab9) { // CHECK:STDOUT: %Self => constants.%Self.ab9 // CHECK:STDOUT: %Self.binding.as_type => constants.%Self.binding.as_type.d31 -// CHECK:STDOUT: %require_complete => constants.%require_complete.4df // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @V(constants.%.Self) { // CHECK:STDOUT: %Self => constants.%.Self // CHECK:STDOUT: %Self.binding.as_type => constants.%.Self.binding.as_type -// CHECK:STDOUT: %require_complete => constants.%require_complete.716 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @V(constants.%I.facet) { // CHECK:STDOUT: %Self => constants.%I.facet // CHECK:STDOUT: %Self.binding.as_type => constants.%empty_struct_type -// CHECK:STDOUT: %require_complete => constants.%complete_type // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_assoc_const_not_constant_after_conversion.carbon @@ -390,7 +373,6 @@ fn CallF() { // CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] // CHECK:STDOUT: %Self.ab9: %I.type = symbolic_binding Self, 0 [symbolic] // CHECK:STDOUT: %Self.binding.as_type.d31: type = symbolic_binding_type Self, 0, %Self.ab9 [symbolic] -// CHECK:STDOUT: %require_complete.4df: = require_complete_type %Self.binding.as_type.d31 [symbolic] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] // CHECK:STDOUT: %assoc0.8a1: %I.assoc_type = assoc_entity element0, @I.%V [concrete] // CHECK:STDOUT: %C: type = class_type @C [concrete] @@ -414,7 +396,6 @@ fn CallF() { // CHECK:STDOUT: %.Self: %I.type = symbolic_binding .Self [symbolic_self] // CHECK:STDOUT: %.Self.binding.as_type: type = symbolic_binding_type .Self, %.Self [symbolic_self] // CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %.Self, @I [symbolic_self] -// CHECK:STDOUT: %require_complete.716: = require_complete_type %.Self.binding.as_type [symbolic_self] // CHECK:STDOUT: %impl.elem0: %.Self.binding.as_type = impl_witness_access %I.lookup_impl_witness, element0 [symbolic_self] // CHECK:STDOUT: %I_where.type: type = facet_type <@I where %impl.elem0 = %empty_tuple> [concrete] // CHECK:STDOUT: %I.impl_witness: = impl_witness @C.as.I.impl.%I.impl_witness_table [concrete] @@ -485,7 +466,6 @@ fn CallF() { // CHECK:STDOUT: generic assoc_const @V(@I.%Self: %I.type) { // CHECK:STDOUT: %Self: %I.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.ab9)] // CHECK:STDOUT: %Self.binding.as_type: type = symbolic_binding_type Self, 0, %Self [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.d31)] -// CHECK:STDOUT: %require_complete: = require_complete_type %Self.binding.as_type [symbolic = %require_complete (constants.%require_complete.4df)] // CHECK:STDOUT: // CHECK:STDOUT: assoc_const V:! @V.%Self.binding.as_type (%Self.binding.as_type.d31); // CHECK:STDOUT: } @@ -552,19 +532,16 @@ fn CallF() { // CHECK:STDOUT: specific @V(constants.%Self.ab9) { // CHECK:STDOUT: %Self => constants.%Self.ab9 // CHECK:STDOUT: %Self.binding.as_type => constants.%Self.binding.as_type.d31 -// CHECK:STDOUT: %require_complete => constants.%require_complete.4df // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @V(constants.%.Self) { // CHECK:STDOUT: %Self => constants.%.Self // CHECK:STDOUT: %Self.binding.as_type => constants.%.Self.binding.as_type -// CHECK:STDOUT: %require_complete => constants.%require_complete.716 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @V(constants.%I.facet) { // CHECK:STDOUT: %Self => constants.%I.facet // CHECK:STDOUT: %Self.binding.as_type => constants.%C -// CHECK:STDOUT: %require_complete => constants.%complete_type // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_monomorphization_failure.carbon @@ -583,7 +560,6 @@ fn CallF() { // CHECK:STDOUT: %Self.cad: %I.type.68b = symbolic_binding Self, 1 [symbolic] // CHECK:STDOUT: %Self.binding.as_type.6f3: type = symbolic_binding_type Self, 1, %Self.cad [symbolic] // CHECK:STDOUT: %array_type: type = array_type %N, %Self.binding.as_type.6f3 [symbolic] -// CHECK:STDOUT: %require_complete: = require_complete_type %array_type [symbolic] // CHECK:STDOUT: %I.assoc_type.223: type = assoc_entity_type @I, @I(%N) [symbolic] // CHECK:STDOUT: %assoc0.e69: %I.assoc_type.223 = assoc_entity element0, @I.%V [symbolic] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] @@ -698,7 +674,6 @@ fn CallF() { // CHECK:STDOUT: %Self: @V.%I.type (%I.type.68b) = symbolic_binding Self, 1 [symbolic = %Self (constants.%Self.cad)] // CHECK:STDOUT: %Self.binding.as_type: type = symbolic_binding_type Self, 1, %Self [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.6f3)] // CHECK:STDOUT: %array_type: type = array_type %N, %Self.binding.as_type [symbolic = %array_type (constants.%array_type)] -// CHECK:STDOUT: %require_complete: = require_complete_type %array_type [symbolic = %require_complete (constants.%require_complete)] // CHECK:STDOUT: // CHECK:STDOUT: assoc_const V:! @V.%array_type (%array_type); // CHECK:STDOUT: } @@ -718,7 +693,6 @@ fn CallF() { // CHECK:STDOUT: %Self => constants.%Self.cad // CHECK:STDOUT: %Self.binding.as_type => constants.%Self.binding.as_type.6f3 // CHECK:STDOUT: %array_type => constants.%array_type -// CHECK:STDOUT: %require_complete => constants.%require_complete // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @I(constants.%int_-1) { @@ -737,7 +711,6 @@ fn CallF() { // CHECK:STDOUT: %Self => constants.%.Self.6e0 // CHECK:STDOUT: %Self.binding.as_type => constants.%.Self.binding.as_type // CHECK:STDOUT: %array_type => -// CHECK:STDOUT: %require_complete => // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_todo_constrained_fn.carbon @@ -746,7 +719,6 @@ fn CallF() { // CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] // CHECK:STDOUT: %Self.ab9: %I.type = symbolic_binding Self, 0 [symbolic] // CHECK:STDOUT: %Self.binding.as_type.d31: type = symbolic_binding_type Self, 0, %Self.ab9 [symbolic] -// CHECK:STDOUT: %require_complete.4df: = require_complete_type %Self.binding.as_type.d31 [symbolic] // CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] // CHECK:STDOUT: %assoc0.8a1: %I.assoc_type = assoc_entity element0, @I.%V [concrete] // CHECK:STDOUT: %type: type = facet_type [concrete] @@ -759,7 +731,6 @@ fn CallF() { // CHECK:STDOUT: %.Self.binding.as_type: type = symbolic_binding_type .Self, %.Self.1dc [symbolic_self] // CHECK:STDOUT: %ImplicitAs.type.d65: type = facet_type <@ImplicitAs, @ImplicitAs(%.Self.binding.as_type)> [symbolic_self] // CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %.Self.1dc, @I [symbolic_self] -// CHECK:STDOUT: %require_complete.716: = require_complete_type %.Self.binding.as_type [symbolic_self] // CHECK:STDOUT: %impl.elem0: %.Self.binding.as_type = impl_witness_access %I.lookup_impl_witness, element0 [symbolic_self] // CHECK:STDOUT: %I_where.type: type = facet_type <@I where %impl.elem0 = %empty_struct and TODO> [concrete] // CHECK:STDOUT: %T: %I_where.type = symbolic_binding T, 0 [symbolic] @@ -839,7 +810,6 @@ fn CallF() { // CHECK:STDOUT: generic assoc_const @V(@I.%Self: %I.type) { // CHECK:STDOUT: %Self: %I.type = symbolic_binding Self, 0 [symbolic = %Self (constants.%Self.ab9)] // CHECK:STDOUT: %Self.binding.as_type: type = symbolic_binding_type Self, 0, %Self [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.d31)] -// CHECK:STDOUT: %require_complete: = require_complete_type %Self.binding.as_type [symbolic = %require_complete (constants.%require_complete.4df)] // CHECK:STDOUT: // CHECK:STDOUT: assoc_const V:! @V.%Self.binding.as_type (%Self.binding.as_type.d31); // CHECK:STDOUT: } @@ -860,13 +830,11 @@ fn CallF() { // CHECK:STDOUT: specific @V(constants.%Self.ab9) { // CHECK:STDOUT: %Self => constants.%Self.ab9 // CHECK:STDOUT: %Self.binding.as_type => constants.%Self.binding.as_type.d31 -// CHECK:STDOUT: %require_complete => constants.%require_complete.4df // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @V(constants.%.Self.1dc) { // CHECK:STDOUT: %Self => constants.%.Self.1dc // CHECK:STDOUT: %Self.binding.as_type => constants.%.Self.binding.as_type -// CHECK:STDOUT: %require_complete => constants.%require_complete.716 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @F(constants.%T) { diff --git a/toolchain/check/testdata/impl/import_interface_assoc_const.carbon b/toolchain/check/testdata/impl/import_interface_assoc_const.carbon index 41c17e1c600d..583a7f4172fd 100644 --- a/toolchain/check/testdata/impl/import_interface_assoc_const.carbon +++ b/toolchain/check/testdata/impl/import_interface_assoc_const.carbon @@ -218,7 +218,7 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: %NonType.type: type = facet_type <@NonType> [concrete] // CHECK:STDOUT: %Self.13f: %NonType.type = symbolic_binding Self, 0 [symbolic] // CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] -// CHECK:STDOUT: %struct_type.a.225: type = struct_type {.a: %empty_struct_type} [concrete] +// CHECK:STDOUT: %struct_type.a: type = struct_type {.a: %empty_struct_type} [concrete] // CHECK:STDOUT: %NonType.assoc_type: type = assoc_entity_type @NonType [concrete] // CHECK:STDOUT: %assoc0.b16: %NonType.assoc_type = assoc_entity element0, @NonType.%Y [concrete] // CHECK:STDOUT: } @@ -272,7 +272,7 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: // CHECK:STDOUT: interface @NonType { // CHECK:STDOUT: %Self: %NonType.type = symbolic_binding Self, 0 [symbolic = constants.%Self.13f] -// CHECK:STDOUT: %Y: %struct_type.a.225 = assoc_const_decl @Y [concrete] { +// CHECK:STDOUT: %Y: %struct_type.a = assoc_const_decl @Y [concrete] { // CHECK:STDOUT: %assoc0: %NonType.assoc_type = assoc_entity element0, @NonType.%Y [concrete = constants.%assoc0.b16] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -301,7 +301,7 @@ impl CD as IF where .F = 0 { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic assoc_const @Y(@NonType.%Self: %NonType.type) { -// CHECK:STDOUT: assoc_const Y:! %struct_type.a.225; +// CHECK:STDOUT: assoc_const Y:! %struct_type.a; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @T(constants.%Self.ab9) {} diff --git a/toolchain/check/testdata/interface/incomplete.carbon b/toolchain/check/testdata/interface/incomplete.carbon index caef29a83ca6..173da23492e5 100644 --- a/toolchain/check/testdata/interface/incomplete.carbon +++ b/toolchain/check/testdata/interface/incomplete.carbon @@ -12,20 +12,51 @@ // TIP: To dump output, run: // TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interface/incomplete.carbon -// --- fail_incomplete_type.carbon +// --- incomplete_type.carbon library "[[@TEST_NAME]]"; class C; interface I { - // CHECK:STDERR: fail_incomplete_type.carbon:[[@LINE+7]]:11: error: associated constant has incomplete type `C` [IncompleteTypeInAssociatedConstantDecl] - // CHECK:STDERR: let T:! C; - // CHECK:STDERR: ^ - // CHECK:STDERR: fail_incomplete_type.carbon:[[@LINE-6]]:1: note: class was forward declared here [ClassForwardDeclaredHere] + let T:! C; +} + +// --- fail_incomplete_type_impl.carbon +library "[[@TEST_NAME]]"; + +class C; + +interface I { + let T:! C; +} + +// CHECK:STDERR: fail_incomplete_type_impl.carbon:[[@LINE+7]]:26: error: invalid use of incomplete type `C` [IncompleteTypeInConversion] +// CHECK:STDERR: impl {} as I where .T = ({} as C) {} +// CHECK:STDERR: ^~~~~~~ +// CHECK:STDERR: fail_incomplete_type_impl.carbon:[[@LINE-9]]:1: note: class was forward declared here [ClassForwardDeclaredHere] +// CHECK:STDERR: class C; +// CHECK:STDERR: ^~~~~~~~ +// CHECK:STDERR: +impl {} as I where .T = ({} as C) {} + +// --- fail_incomplete_type_usage.carbon +library "[[@TEST_NAME]]"; + +class C; + +interface I { + let T:! C; +} + +fn F[U:! I](a: U) { + // CHECK:STDERR: fail_incomplete_type_usage.carbon:[[@LINE+7]]:3: error: invalid use of incomplete type `C` [IncompleteTypeInConversion] + // CHECK:STDERR: a.T; + // CHECK:STDERR: ^~~ + // CHECK:STDERR: fail_incomplete_type_usage.carbon:[[@LINE-10]]:1: note: class was forward declared here [ClassForwardDeclaredHere] // CHECK:STDERR: class C; // CHECK:STDERR: ^~~~~~~~ // CHECK:STDERR: - let T:! C; + a.T; } // --- fail_incomplete_extend_constraint.carbon @@ -72,7 +103,7 @@ interface A(T:! type) { extend require impls A({}); } -// CHECK:STDOUT: --- fail_incomplete_type.carbon +// CHECK:STDOUT: --- incomplete_type.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { // CHECK:STDOUT: %C: type = class_type @C [concrete] @@ -93,7 +124,7 @@ interface A(T:! type) { // CHECK:STDOUT: // CHECK:STDOUT: interface @I { // CHECK:STDOUT: %Self: %I.type = symbolic_binding Self, 0 [symbolic = constants.%Self] -// CHECK:STDOUT: %T: = assoc_const_decl @T [concrete] { +// CHECK:STDOUT: %T: %C = assoc_const_decl @T [concrete] { // CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%T [concrete = constants.%assoc0] // CHECK:STDOUT: } // CHECK:STDOUT: @@ -107,13 +138,184 @@ interface A(T:! type) { // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: generic assoc_const @T(@I.%Self: %I.type) { -// CHECK:STDOUT: assoc_const T:! ; +// CHECK:STDOUT: assoc_const T:! %C; // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: class @C; // CHECK:STDOUT: // CHECK:STDOUT: specific @T(constants.%Self) {} // CHECK:STDOUT: +// CHECK:STDOUT: --- fail_incomplete_type_impl.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] +// CHECK:STDOUT: %Self: %I.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] +// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%T [concrete] +// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete] +// CHECK:STDOUT: %empty_struct: %empty_struct_type = struct_value () [concrete] +// CHECK:STDOUT: %.Self: %I.type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %.Self.binding.as_type: type = symbolic_binding_type .Self, %.Self [symbolic_self] +// CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %.Self, @I [symbolic_self] +// CHECK:STDOUT: %impl.elem0: %C = impl_witness_access %I.lookup_impl_witness, element0 [symbolic_self] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: .I = %I.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} +// CHECK:STDOUT: impl_decl @empty_struct_type.as..impl [concrete] {} { +// CHECK:STDOUT: %.loc16_7.1: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %.loc16_7.2: type = converted %.loc16_7.1, constants.%empty_struct_type [concrete = constants.%empty_struct_type] +// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] +// CHECK:STDOUT: %.Self: %I.type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %.Self.ref: %I.type = name_ref .Self, %.Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %.Self.as_type: type = facet_access_type %.Self.ref [symbolic_self = constants.%.Self.binding.as_type] +// CHECK:STDOUT: %.loc16_20: type = converted %.Self.ref, %.Self.as_type [symbolic_self = constants.%.Self.binding.as_type] +// CHECK:STDOUT: %T.ref: %I.assoc_type = name_ref T, @T.%assoc0 [concrete = constants.%assoc0] +// CHECK:STDOUT: %impl.elem0: %C = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic_self = constants.%impl.elem0] +// CHECK:STDOUT: %.loc16_27: %empty_struct_type = struct_literal () [concrete = constants.%empty_struct] +// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C] +// CHECK:STDOUT: %.loc16_14: type = where_expr %.Self [concrete = ] { +// CHECK:STDOUT: requirement_base_facet_type constants.%I.type +// CHECK:STDOUT: requirement_rewrite %impl.elem0, +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @I { +// CHECK:STDOUT: %Self: %I.type = symbolic_binding Self, 0 [symbolic = constants.%Self] +// CHECK:STDOUT: %T: %C = assoc_const_decl @T [concrete] { +// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%T [concrete = constants.%assoc0] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: .C = +// CHECK:STDOUT: .T = @T.%assoc0 +// CHECK:STDOUT: witness = (%T) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic assoc_const @T(@I.%Self: %I.type) { +// CHECK:STDOUT: assoc_const T:! %C; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: impl @empty_struct_type.as..impl: %.loc16_7.2 as %.loc16_14 { +// CHECK:STDOUT: !members: +// CHECK:STDOUT: witness = +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C; +// CHECK:STDOUT: +// CHECK:STDOUT: specific @T(constants.%Self) {} +// CHECK:STDOUT: +// CHECK:STDOUT: specific @T(constants.%.Self) {} +// CHECK:STDOUT: +// CHECK:STDOUT: --- fail_incomplete_type_usage.carbon +// CHECK:STDOUT: +// CHECK:STDOUT: constants { +// CHECK:STDOUT: %C: type = class_type @C [concrete] +// CHECK:STDOUT: %I.type: type = facet_type <@I> [concrete] +// CHECK:STDOUT: %Self: %I.type = symbolic_binding Self, 0 [symbolic] +// CHECK:STDOUT: %I.assoc_type: type = assoc_entity_type @I [concrete] +// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%T [concrete] +// CHECK:STDOUT: %type: type = facet_type [concrete] +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self] +// CHECK:STDOUT: %U: %I.type = symbolic_binding U, 0 [symbolic] +// CHECK:STDOUT: %pattern_type.9d9: type = pattern_type %I.type [concrete] +// CHECK:STDOUT: %U.binding.as_type: type = symbolic_binding_type U, 0, %U [symbolic] +// CHECK:STDOUT: %pattern_type.422: type = pattern_type %U.binding.as_type [symbolic] +// CHECK:STDOUT: %F.type: type = fn_type @F [concrete] +// CHECK:STDOUT: %F: %F.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete: = require_complete_type %U.binding.as_type [symbolic] +// CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %U, @I [symbolic] +// CHECK:STDOUT: %impl.elem0: %C = impl_witness_access %I.lookup_impl_witness, element0 [symbolic] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: file { +// CHECK:STDOUT: package: = namespace [concrete] { +// CHECK:STDOUT: .C = %C.decl +// CHECK:STDOUT: .I = %I.decl +// CHECK:STDOUT: .F = %F.decl +// CHECK:STDOUT: } +// CHECK:STDOUT: %C.decl: type = class_decl @C [concrete = constants.%C] {} {} +// CHECK:STDOUT: %I.decl: type = interface_decl @I [concrete = constants.%I.type] {} {} +// CHECK:STDOUT: %F.decl: %F.type = fn_decl @F [concrete = constants.%F] { +// CHECK:STDOUT: %U.patt: %pattern_type.9d9 = symbolic_binding_pattern U, 0 [concrete] +// CHECK:STDOUT: %a.patt: @F.%pattern_type (%pattern_type.422) = value_binding_pattern a [concrete] +// CHECK:STDOUT: %a.param_patt: @F.%pattern_type (%pattern_type.422) = value_param_pattern %a.patt, call_param0 [concrete] +// CHECK:STDOUT: } { +// CHECK:STDOUT: %.loc9_10: type = splice_block %I.ref [concrete = constants.%I.type] { +// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self] +// CHECK:STDOUT: %I.ref: type = name_ref I, file.%I.decl [concrete = constants.%I.type] +// CHECK:STDOUT: } +// CHECK:STDOUT: %U.loc9_6.2: %I.type = symbolic_binding U, 0 [symbolic = %U.loc9_6.1 (constants.%U)] +// CHECK:STDOUT: %a.param: @F.%U.binding.as_type (%U.binding.as_type) = value_param call_param0 +// CHECK:STDOUT: %.loc9_16.1: type = splice_block %.loc9_16.2 [symbolic = %U.binding.as_type (constants.%U.binding.as_type)] { +// CHECK:STDOUT: %U.ref: %I.type = name_ref U, %U.loc9_6.2 [symbolic = %U.loc9_6.1 (constants.%U)] +// CHECK:STDOUT: %U.as_type: type = facet_access_type %U.ref [symbolic = %U.binding.as_type (constants.%U.binding.as_type)] +// CHECK:STDOUT: %.loc9_16.2: type = converted %U.ref, %U.as_type [symbolic = %U.binding.as_type (constants.%U.binding.as_type)] +// CHECK:STDOUT: } +// CHECK:STDOUT: %a: @F.%U.binding.as_type (%U.binding.as_type) = value_binding a, %a.param +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: interface @I { +// CHECK:STDOUT: %Self: %I.type = symbolic_binding Self, 0 [symbolic = constants.%Self] +// CHECK:STDOUT: %T: %C = assoc_const_decl @T [concrete] { +// CHECK:STDOUT: %assoc0: %I.assoc_type = assoc_entity element0, @I.%T [concrete = constants.%assoc0] +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: !members: +// CHECK:STDOUT: .Self = %Self +// CHECK:STDOUT: .C = +// CHECK:STDOUT: .T = @T.%assoc0 +// CHECK:STDOUT: witness = (%T) +// CHECK:STDOUT: +// CHECK:STDOUT: !requires: +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: generic assoc_const @T(@I.%Self: %I.type) { +// CHECK:STDOUT: assoc_const T:! %C; +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: class @C; +// CHECK:STDOUT: +// CHECK:STDOUT: generic fn @F(%U.loc9_6.2: %I.type) { +// CHECK:STDOUT: %U.loc9_6.1: %I.type = symbolic_binding U, 0 [symbolic = %U.loc9_6.1 (constants.%U)] +// CHECK:STDOUT: %U.binding.as_type: type = symbolic_binding_type U, 0, %U.loc9_6.1 [symbolic = %U.binding.as_type (constants.%U.binding.as_type)] +// CHECK:STDOUT: %pattern_type: type = pattern_type %U.binding.as_type [symbolic = %pattern_type (constants.%pattern_type.422)] +// CHECK:STDOUT: +// CHECK:STDOUT: !definition: +// CHECK:STDOUT: %require_complete: = require_complete_type %U.binding.as_type [symbolic = %require_complete (constants.%require_complete)] +// CHECK:STDOUT: %I.lookup_impl_witness: = lookup_impl_witness %U.loc9_6.1, @I [symbolic = %I.lookup_impl_witness (constants.%I.lookup_impl_witness)] +// CHECK:STDOUT: %impl.elem0.loc17_4.2: %C = impl_witness_access %I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc17_4.2 (constants.%impl.elem0)] +// CHECK:STDOUT: +// CHECK:STDOUT: fn(%a.param: @F.%U.binding.as_type (%U.binding.as_type)) { +// CHECK:STDOUT: !entry: +// CHECK:STDOUT: %a.ref: @F.%U.binding.as_type (%U.binding.as_type) = name_ref a, %a +// CHECK:STDOUT: %T.ref: %I.assoc_type = name_ref T, @T.%assoc0 [concrete = constants.%assoc0] +// CHECK:STDOUT: %impl.elem0.loc17_4.1: %C = impl_witness_access constants.%I.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc17_4.2 (constants.%impl.elem0)] +// CHECK:STDOUT: return +// CHECK:STDOUT: } +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @T(constants.%Self) {} +// CHECK:STDOUT: +// CHECK:STDOUT: specific @F(constants.%U) { +// CHECK:STDOUT: %U.loc9_6.1 => constants.%U +// CHECK:STDOUT: %U.binding.as_type => constants.%U.binding.as_type +// CHECK:STDOUT: %pattern_type => constants.%pattern_type.422 +// CHECK:STDOUT: } +// CHECK:STDOUT: +// CHECK:STDOUT: specific @T(constants.%U) {} +// CHECK:STDOUT: // CHECK:STDOUT: --- fail_incomplete_extend_constraint.carbon // CHECK:STDOUT: // CHECK:STDOUT: constants { diff --git a/toolchain/check/testdata/interface/member_lookup.carbon b/toolchain/check/testdata/interface/member_lookup.carbon index 3404edddc894..6caf20948e11 100644 --- a/toolchain/check/testdata/interface/member_lookup.carbon +++ b/toolchain/check/testdata/interface/member_lookup.carbon @@ -64,7 +64,6 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %Interface.type.442: type = facet_type <@Interface, @Interface(%T.67d)> [symbolic] // CHECK:STDOUT: %Self.ade: %Interface.type.442 = symbolic_binding Self, 1 [symbolic] // CHECK:STDOUT: %ptr.e8f: type = ptr_type %T.67d [symbolic] -// CHECK:STDOUT: %require_complete.ef1: = require_complete_type %ptr.e8f [symbolic] // CHECK:STDOUT: %Interface.assoc_type.5a2: type = assoc_entity_type @Interface, @Interface(%T.67d) [symbolic] // CHECK:STDOUT: %assoc0.624: %Interface.assoc_type.5a2 = assoc_entity element0, @Interface.%X [symbolic] // CHECK:STDOUT: %I.682: %Interface.type.442 = symbolic_binding I, 1 [symbolic] @@ -73,6 +72,7 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %pattern_type.4f4: type = pattern_type %ptr.e8f [symbolic] // CHECK:STDOUT: %AccessGeneric.type: type = fn_type @AccessGeneric [concrete] // CHECK:STDOUT: %AccessGeneric: %AccessGeneric.type = struct_value () [concrete] +// CHECK:STDOUT: %require_complete.ef1: = require_complete_type %ptr.e8f [symbolic] // CHECK:STDOUT: %require_complete.46e: = require_complete_type %Interface.type.442 [symbolic] // CHECK:STDOUT: %I.binding.as_type.24f: type = symbolic_binding_type I, 1, %I.682 [symbolic] // CHECK:STDOUT: %Interface.lookup_impl_witness.9f1: = lookup_impl_witness %I.682, @Interface, @Interface(%T.67d) [symbolic] @@ -106,7 +106,6 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %assoc0.2ec: %Interface.assoc_type.77f = assoc_entity element0, @Interface.%X [concrete] // CHECK:STDOUT: %I.binding.as_type.78a: type = symbolic_binding_type I, 0, %I.50d [symbolic] // CHECK:STDOUT: %Interface.lookup_impl_witness.4be: = lookup_impl_witness %I.50d, @Interface, @Interface(%i32) [symbolic] -// CHECK:STDOUT: %complete_type.3d0: = complete_type_witness %ptr.235 [concrete] // CHECK:STDOUT: %impl.elem0.322: %ptr.235 = impl_witness_access %Interface.lookup_impl_witness.4be, element0 [symbolic] // CHECK:STDOUT: %Copy.impl_witness.843: = impl_witness imports.%Copy.impl_witness_table.c3a, @ptr.as.Copy.impl(%i32) [concrete] // CHECK:STDOUT: %ptr.as.Copy.impl.Op.type.c3c: type = fn_type @ptr.as.Copy.impl.Op, @ptr.as.Copy.impl(%i32) [concrete] @@ -216,7 +215,6 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: generic assoc_const @X(@Interface.%T.loc4_21.2: type, @Interface.%Self.loc4_31.1: @Interface.%Interface.type (%Interface.type.442)) { // CHECK:STDOUT: %T: type = symbolic_binding T, 0 [symbolic = %T (constants.%T.67d)] // CHECK:STDOUT: %ptr: type = ptr_type %T [symbolic = %ptr (constants.%ptr.e8f)] -// CHECK:STDOUT: %require_complete: = require_complete_type %ptr [symbolic = %require_complete (constants.%require_complete.ef1)] // CHECK:STDOUT: // CHECK:STDOUT: assoc_const X:! @X.%ptr (%ptr.e8f); // CHECK:STDOUT: } @@ -304,7 +302,6 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: specific @X(constants.%T.67d, constants.%Self.ade) { // CHECK:STDOUT: %T => constants.%T.67d // CHECK:STDOUT: %ptr => constants.%ptr.e8f -// CHECK:STDOUT: %require_complete => constants.%require_complete.ef1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AccessGeneric(constants.%T.67d, constants.%I.682) { @@ -320,7 +317,6 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: specific @X(constants.%T.67d, constants.%I.682) { // CHECK:STDOUT: %T => constants.%T.67d // CHECK:STDOUT: %ptr => constants.%ptr.e8f -// CHECK:STDOUT: %require_complete => constants.%require_complete.ef1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @Interface(constants.%i32) { @@ -340,7 +336,6 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: specific @X(constants.%i32, constants.%I.50d) { // CHECK:STDOUT: %T => constants.%i32 // CHECK:STDOUT: %ptr => constants.%ptr.235 -// CHECK:STDOUT: %require_complete => constants.%complete_type.3d0 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: --- fail_no_member.carbon @@ -355,7 +350,6 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: %Interface.type.442: type = facet_type <@Interface, @Interface(%T)> [symbolic] // CHECK:STDOUT: %Self.ade: %Interface.type.442 = symbolic_binding Self, 1 [symbolic] // CHECK:STDOUT: %ptr: type = ptr_type %T [symbolic] -// CHECK:STDOUT: %require_complete.ef1: = require_complete_type %ptr [symbolic] // CHECK:STDOUT: %Interface.assoc_type.5a2: type = assoc_entity_type @Interface, @Interface(%T) [symbolic] // CHECK:STDOUT: %assoc0.624: %Interface.assoc_type.5a2 = assoc_entity element0, @Interface.%X [symbolic] // CHECK:STDOUT: %I.682: %Interface.type.442 = symbolic_binding I, 1 [symbolic] @@ -477,7 +471,6 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: generic assoc_const @X(@Interface.%T.loc4_21.2: type, @Interface.%Self.loc4_31.1: @Interface.%Interface.type (%Interface.type.442)) { // CHECK:STDOUT: %T: type = symbolic_binding T, 0 [symbolic = %T (constants.%T)] // CHECK:STDOUT: %ptr: type = ptr_type %T [symbolic = %ptr (constants.%ptr)] -// CHECK:STDOUT: %require_complete: = require_complete_type %ptr [symbolic = %require_complete (constants.%require_complete.ef1)] // CHECK:STDOUT: // CHECK:STDOUT: assoc_const X:! @X.%ptr (%ptr); // CHECK:STDOUT: } @@ -534,7 +527,6 @@ fn AccessMissingConcrete(I:! Interface(i32)) -> i32 { // CHECK:STDOUT: specific @X(constants.%T, constants.%Self.ade) { // CHECK:STDOUT: %T => constants.%T // CHECK:STDOUT: %ptr => constants.%ptr -// CHECK:STDOUT: %require_complete => constants.%require_complete.ef1 // CHECK:STDOUT: } // CHECK:STDOUT: // CHECK:STDOUT: specific @AccessMissingGeneric(constants.%T, constants.%I.682) { diff --git a/toolchain/diagnostics/diagnostic_kind.def b/toolchain/diagnostics/diagnostic_kind.def index da7e1d0675fc..e0061fb258f1 100644 --- a/toolchain/diagnostics/diagnostic_kind.def +++ b/toolchain/diagnostics/diagnostic_kind.def @@ -435,7 +435,6 @@ CARBON_DIAGNOSTIC_KIND(NameUseBeforeDecl) CARBON_DIAGNOSTIC_KIND(NameUseBeforeDeclNote) CARBON_DIAGNOSTIC_KIND(RepeatedConst) CARBON_DIAGNOSTIC_KIND(IncompleteTypeInAdaptDecl) -CARBON_DIAGNOSTIC_KIND(IncompleteTypeInAssociatedConstantDecl) CARBON_DIAGNOSTIC_KIND(IncompleteTypeInBaseDecl) CARBON_DIAGNOSTIC_KIND(IncompleteTypeInBindingDecl) CARBON_DIAGNOSTIC_KIND(IncompleteTypeInConversion)