|
|
@@ -82,14 +82,15 @@ interface HasF {
|
|
|
fn F[self: Self]();
|
|
|
}
|
|
|
|
|
|
-// TODO: Reject this declaration because U cannot be deduced.
|
|
|
+// CHECK:STDERR: fail_incomplete_deduction.carbon:[[@LINE+4]]:13: error: `impl` with unused generic binding [ImplUnusedBinding]
|
|
|
+// CHECK:STDERR: impl forall [T:! type, U:! type] T as HasF {
|
|
|
+// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~
|
|
|
+// CHECK:STDERR:
|
|
|
impl forall [T:! type, U:! type] T as HasF {
|
|
|
fn F[self: Self]() {}
|
|
|
}
|
|
|
|
|
|
fn G(x: {}) {
|
|
|
- // TODO: It'd be nice to include a note here saying that deduction failed because
|
|
|
- // we couldn't deduce a value for 'U'.
|
|
|
// CHECK:STDERR: fail_incomplete_deduction.carbon:[[@LINE+4]]:3: error: cannot access member of interface `HasF` in type `{}` that does not implement that interface [MissingImplInMemberAccess]
|
|
|
// CHECK:STDERR: x.(HasF.F)();
|
|
|
// CHECK:STDERR: ^~~~~~~~~~
|
|
|
@@ -1034,10 +1035,9 @@ fn G(x: A) {
|
|
|
// CHECK:STDOUT: %T.patt: type = symbolic_binding_pattern T, 0 [symbolic]
|
|
|
// CHECK:STDOUT: %U: type = bind_symbolic_name U, 1 [symbolic]
|
|
|
// CHECK:STDOUT: %U.patt: type = symbolic_binding_pattern U, 1 [symbolic]
|
|
|
-// CHECK:STDOUT: %impl_witness: <witness> = impl_witness (@impl.%F.decl), @impl(%T, %U) [symbolic]
|
|
|
+// CHECK:STDOUT: %impl_witness: <witness> = impl_witness (invalid), @impl(%T, %U) [symbolic]
|
|
|
// CHECK:STDOUT: %F.type.56e: type = fn_type @F.2, @impl(%T, %U) [symbolic]
|
|
|
// CHECK:STDOUT: %F.9b8: %F.type.56e = struct_value () [symbolic]
|
|
|
-// CHECK:STDOUT: %HasF.facet: %HasF.type = facet_value %T, (%impl_witness) [symbolic]
|
|
|
// CHECK:STDOUT: %require_complete: <witness> = require_complete_type %T [symbolic]
|
|
|
// CHECK:STDOUT: %empty_struct_type: type = struct_type {} [concrete]
|
|
|
// CHECK:STDOUT: %G.type: type = fn_type @G [concrete]
|
|
|
@@ -1060,23 +1060,23 @@ fn G(x: A) {
|
|
|
// CHECK:STDOUT: %Core.import = import Core
|
|
|
// CHECK:STDOUT: %HasF.decl: type = interface_decl @HasF [concrete = constants.%HasF.type] {} {}
|
|
|
// CHECK:STDOUT: impl_decl @impl [concrete] {
|
|
|
-// CHECK:STDOUT: %T.patt.loc9_14.1: type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc9_14.2 (constants.%T.patt)]
|
|
|
-// CHECK:STDOUT: %U.patt.loc9_24.1: type = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc9_24.2 (constants.%U.patt)]
|
|
|
+// CHECK:STDOUT: %T.patt.loc12_14.1: type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc12_14.2 (constants.%T.patt)]
|
|
|
+// CHECK:STDOUT: %U.patt.loc12_24.1: type = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc12_24.2 (constants.%U.patt)]
|
|
|
// CHECK:STDOUT: } {
|
|
|
-// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc9_14.1 [symbolic = %T.loc9_14.2 (constants.%T)]
|
|
|
+// CHECK:STDOUT: %T.ref: type = name_ref T, %T.loc12_14.1 [symbolic = %T.loc12_14.2 (constants.%T)]
|
|
|
// CHECK:STDOUT: %HasF.ref: type = name_ref HasF, file.%HasF.decl [concrete = constants.%HasF.type]
|
|
|
-// CHECK:STDOUT: %T.loc9_14.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_14.2 (constants.%T)]
|
|
|
-// CHECK:STDOUT: %U.loc9_24.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc9_24.2 (constants.%U)]
|
|
|
+// CHECK:STDOUT: %T.loc12_14.1: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_14.2 (constants.%T)]
|
|
|
+// CHECK:STDOUT: %U.loc12_24.1: type = bind_symbolic_name U, 1 [symbolic = %U.loc12_24.2 (constants.%U)]
|
|
|
// CHECK:STDOUT: }
|
|
|
-// CHECK:STDOUT: %impl_witness: <witness> = impl_witness (@impl.%F.decl), @impl(constants.%T, constants.%U) [symbolic = @impl.%impl_witness (constants.%impl_witness)]
|
|
|
+// CHECK:STDOUT: %impl_witness: <witness> = impl_witness (invalid), @impl(constants.%T, constants.%U) [symbolic = @impl.%impl_witness (constants.%impl_witness)]
|
|
|
// CHECK:STDOUT: %G.decl: %G.type = fn_decl @G [concrete = constants.%G] {
|
|
|
// CHECK:STDOUT: %x.patt: %empty_struct_type = binding_pattern x
|
|
|
// CHECK:STDOUT: %x.param_patt: %empty_struct_type = value_param_pattern %x.patt, call_param0
|
|
|
// CHECK:STDOUT: } {
|
|
|
// CHECK:STDOUT: %x.param: %empty_struct_type = value_param call_param0
|
|
|
-// CHECK:STDOUT: %.loc13_10.1: type = splice_block %.loc13_10.3 [concrete = constants.%empty_struct_type] {
|
|
|
-// CHECK:STDOUT: %.loc13_10.2: %empty_struct_type = struct_literal ()
|
|
|
-// CHECK:STDOUT: %.loc13_10.3: type = converted %.loc13_10.2, constants.%empty_struct_type [concrete = constants.%empty_struct_type]
|
|
|
+// CHECK:STDOUT: %.loc16_10.1: type = splice_block %.loc16_10.3 [concrete = constants.%empty_struct_type] {
|
|
|
+// CHECK:STDOUT: %.loc16_10.2: %empty_struct_type = struct_literal ()
|
|
|
+// CHECK:STDOUT: %.loc16_10.3: type = converted %.loc16_10.2, constants.%empty_struct_type [concrete = constants.%empty_struct_type]
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT: %x: %empty_struct_type = bind_name x, %x.param
|
|
|
// CHECK:STDOUT: }
|
|
|
@@ -1104,15 +1104,15 @@ fn G(x: A) {
|
|
|
// CHECK:STDOUT: witness = (%F.decl)
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
-// CHECK:STDOUT: generic impl @impl(%T.loc9_14.1: type, %U.loc9_24.1: type) {
|
|
|
-// CHECK:STDOUT: %T.loc9_14.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc9_14.2 (constants.%T)]
|
|
|
-// CHECK:STDOUT: %T.patt.loc9_14.2: type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc9_14.2 (constants.%T.patt)]
|
|
|
-// CHECK:STDOUT: %U.loc9_24.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc9_24.2 (constants.%U)]
|
|
|
-// CHECK:STDOUT: %U.patt.loc9_24.2: type = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc9_24.2 (constants.%U.patt)]
|
|
|
-// CHECK:STDOUT: %impl_witness: <witness> = impl_witness (%F.decl), @impl(%T.loc9_14.2, %U.loc9_24.2) [symbolic = %impl_witness (constants.%impl_witness)]
|
|
|
+// CHECK:STDOUT: generic impl @impl(%T.loc12_14.1: type, %U.loc12_24.1: type) {
|
|
|
+// CHECK:STDOUT: %T.loc12_14.2: type = bind_symbolic_name T, 0 [symbolic = %T.loc12_14.2 (constants.%T)]
|
|
|
+// CHECK:STDOUT: %T.patt.loc12_14.2: type = symbolic_binding_pattern T, 0 [symbolic = %T.patt.loc12_14.2 (constants.%T.patt)]
|
|
|
+// CHECK:STDOUT: %U.loc12_24.2: type = bind_symbolic_name U, 1 [symbolic = %U.loc12_24.2 (constants.%U)]
|
|
|
+// CHECK:STDOUT: %U.patt.loc12_24.2: type = symbolic_binding_pattern U, 1 [symbolic = %U.patt.loc12_24.2 (constants.%U.patt)]
|
|
|
+// CHECK:STDOUT: %impl_witness: <witness> = impl_witness (invalid), @impl(%T.loc12_14.2, %U.loc12_24.2) [symbolic = %impl_witness (constants.%impl_witness)]
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: !definition:
|
|
|
-// CHECK:STDOUT: %F.type: type = fn_type @F.2, @impl(%T.loc9_14.2, %U.loc9_24.2) [symbolic = %F.type (constants.%F.type.56e)]
|
|
|
+// CHECK:STDOUT: %F.type: type = fn_type @F.2, @impl(%T.loc12_14.2, %U.loc12_24.2) [symbolic = %F.type (constants.%F.type.56e)]
|
|
|
// CHECK:STDOUT: %F: @impl.%F.type (%F.type.56e) = struct_value () [symbolic = %F (constants.%F.9b8)]
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: impl: %T.ref as %HasF.ref {
|
|
|
@@ -1127,7 +1127,7 @@ fn G(x: A) {
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: !members:
|
|
|
// CHECK:STDOUT: .F = %F.decl
|
|
|
-// CHECK:STDOUT: witness = file.%impl_witness
|
|
|
+// CHECK:STDOUT: witness = <error>
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
@@ -1138,7 +1138,7 @@ fn G(x: A) {
|
|
|
// CHECK:STDOUT: fn[%self.param_patt: @F.1.%Self.as_type.loc5_14.1 (%Self.as_type)]();
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
-// CHECK:STDOUT: generic fn @F.2(@impl.%T.loc9_14.1: type, @impl.%U.loc9_24.1: type) {
|
|
|
+// CHECK:STDOUT: generic fn @F.2(@impl.%T.loc12_14.1: type, @impl.%U.loc12_24.1: type) {
|
|
|
// CHECK:STDOUT: %T: type = bind_symbolic_name T, 0 [symbolic = %T (constants.%T)]
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: !definition:
|
|
|
@@ -1164,10 +1164,10 @@ fn G(x: A) {
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: specific @impl(constants.%T, constants.%U) {
|
|
|
-// CHECK:STDOUT: %T.loc9_14.2 => constants.%T
|
|
|
-// CHECK:STDOUT: %T.patt.loc9_14.2 => constants.%T
|
|
|
-// CHECK:STDOUT: %U.loc9_24.2 => constants.%U
|
|
|
-// CHECK:STDOUT: %U.patt.loc9_24.2 => constants.%U
|
|
|
+// CHECK:STDOUT: %T.loc12_14.2 => constants.%T
|
|
|
+// CHECK:STDOUT: %T.patt.loc12_14.2 => constants.%T
|
|
|
+// CHECK:STDOUT: %U.loc12_24.2 => constants.%U
|
|
|
+// CHECK:STDOUT: %U.patt.loc12_24.2 => constants.%U
|
|
|
// CHECK:STDOUT: %impl_witness => constants.%impl_witness
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: !definition:
|
|
|
@@ -1175,17 +1175,12 @@ fn G(x: A) {
|
|
|
// CHECK:STDOUT: %F => constants.%F.9b8
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
-// CHECK:STDOUT: specific @impl(%T.loc9_14.2, %U.loc9_24.2) {}
|
|
|
+// CHECK:STDOUT: specific @impl(%T.loc12_14.2, %U.loc12_24.2) {}
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: specific @F.2(constants.%T, constants.%U) {
|
|
|
// CHECK:STDOUT: %T => constants.%T
|
|
|
// CHECK:STDOUT: }
|
|
|
// CHECK:STDOUT:
|
|
|
-// CHECK:STDOUT: specific @F.1(constants.%HasF.facet) {
|
|
|
-// CHECK:STDOUT: %Self => constants.%HasF.facet
|
|
|
-// CHECK:STDOUT: %Self.as_type.loc5_14.1 => constants.%T
|
|
|
-// CHECK:STDOUT: }
|
|
|
-// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: --- fail_inconsistent_deduction.carbon
|
|
|
// CHECK:STDOUT:
|
|
|
// CHECK:STDOUT: constants {
|