Implement unused pattern bindings, continued (#6518)

Implementation of unused pattern bindings #2022, continued.

Whereas previous PR #6460 took care of parsing, and PR #6479 prepared
the stage by using _ in some test cases, this PR has the the actual
implementation, using a simple dataflow analysis.

---------

Co-authored-by: Burak Emir <bqe@google.com>
Co-authored-by: jonmeow <jperkins@google.com>
This commit is contained in:
Burak Emir
2026-02-19 23:33:36 +00:00
committed by GitHub
co-authored by Burak Emir jonmeow
parent bea24a8bee
commit fdb188ccfd
366 changed files with 8453 additions and 7996 deletions
+1 -1
View File
@@ -14,7 +14,7 @@
interface Empty {}
fn F(e: Empty) {}
fn F(unused e: Empty) {}
// CHECK:STDOUT: --- as_type.carbon
// CHECK:STDOUT:
+11 -11
View File
@@ -19,7 +19,7 @@ class C {}
impl C as Empty {}
fn F(T:! Empty) {
var x: T*;
var unused x: T*;
}
// CHECK:STDOUT: --- as_type_of_type.carbon
@@ -118,11 +118,11 @@ fn F(T:! Empty) {
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT: %T.binding.as_type: type = symbolic_binding_type T, 0, %T.loc21_6.1 [symbolic = %T.binding.as_type (constants.%T.binding.as_type)]
// CHECK:STDOUT: %ptr.loc22_11.2: type = ptr_type %T.binding.as_type [symbolic = %ptr.loc22_11.2 (constants.%ptr)]
// CHECK:STDOUT: %require_complete: <witness> = require_complete_type %ptr.loc22_11.2 [symbolic = %require_complete (constants.%require_complete)]
// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr.loc22_11.2 [symbolic = %pattern_type (constants.%pattern_type.fd9)]
// CHECK:STDOUT: %Destroy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc22_11.2, @Destroy [symbolic = %Destroy.lookup_impl_witness (constants.%Destroy.lookup_impl_witness)]
// CHECK:STDOUT: %Destroy.facet: %Destroy.type = facet_value %ptr.loc22_11.2, (%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet)]
// CHECK:STDOUT: %ptr.loc22_18.2: type = ptr_type %T.binding.as_type [symbolic = %ptr.loc22_18.2 (constants.%ptr)]
// CHECK:STDOUT: %require_complete: <witness> = require_complete_type %ptr.loc22_18.2 [symbolic = %require_complete (constants.%require_complete)]
// CHECK:STDOUT: %pattern_type: type = pattern_type %ptr.loc22_18.2 [symbolic = %pattern_type (constants.%pattern_type.fd9)]
// CHECK:STDOUT: %Destroy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc22_18.2, @Destroy [symbolic = %Destroy.lookup_impl_witness (constants.%Destroy.lookup_impl_witness)]
// CHECK:STDOUT: %Destroy.facet: %Destroy.type = facet_value %ptr.loc22_18.2, (%Destroy.lookup_impl_witness) [symbolic = %Destroy.facet (constants.%Destroy.facet)]
// CHECK:STDOUT: %Destroy.WithSelf.Op.type: type = fn_type @Destroy.WithSelf.Op, @Destroy(%Destroy.facet) [symbolic = %Destroy.WithSelf.Op.type (constants.%Destroy.WithSelf.Op.type.4bc)]
// CHECK:STDOUT: %.loc22_3: type = fn_type_with_self_type %Destroy.WithSelf.Op.type, %Destroy.facet [symbolic = %.loc22_3 (constants.%.40e)]
// CHECK:STDOUT: %impl.elem0.loc22_3.2: @F.%.loc22_3 (%.40e) = impl_witness_access %Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc22_3.2 (constants.%impl.elem0)]
@@ -134,14 +134,14 @@ fn F(T:! Empty) {
// CHECK:STDOUT: %x.patt: @F.%pattern_type (%pattern_type.fd9) = ref_binding_pattern x [concrete]
// CHECK:STDOUT: %x.var_patt: @F.%pattern_type (%pattern_type.fd9) = var_pattern %x.patt [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT: %x.var: ref @F.%ptr.loc22_11.2 (%ptr) = var %x.var_patt
// CHECK:STDOUT: %.loc22_11.1: type = splice_block %ptr.loc22_11.1 [symbolic = %ptr.loc22_11.2 (constants.%ptr)] {
// CHECK:STDOUT: %x.var: ref @F.%ptr.loc22_18.2 (%ptr) = var %x.var_patt
// CHECK:STDOUT: %.loc22_18.1: type = splice_block %ptr.loc22_18.1 [symbolic = %ptr.loc22_18.2 (constants.%ptr)] {
// CHECK:STDOUT: %T.ref: %Empty.type = name_ref T, %T.loc21_6.2 [symbolic = %T.loc21_6.1 (constants.%T)]
// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.ref [symbolic = %T.binding.as_type (constants.%T.binding.as_type)]
// CHECK:STDOUT: %.loc22_11.2: type = converted %T.ref, %T.as_type [symbolic = %T.binding.as_type (constants.%T.binding.as_type)]
// CHECK:STDOUT: %ptr.loc22_11.1: type = ptr_type %.loc22_11.2 [symbolic = %ptr.loc22_11.2 (constants.%ptr)]
// CHECK:STDOUT: %.loc22_18.2: type = converted %T.ref, %T.as_type [symbolic = %T.binding.as_type (constants.%T.binding.as_type)]
// CHECK:STDOUT: %ptr.loc22_18.1: type = ptr_type %.loc22_18.2 [symbolic = %ptr.loc22_18.2 (constants.%ptr)]
// CHECK:STDOUT: }
// CHECK:STDOUT: %x: ref @F.%ptr.loc22_11.2 (%ptr) = ref_binding x, %x.var
// CHECK:STDOUT: %x: ref @F.%ptr.loc22_18.2 (%ptr) = ref_binding x, %x.var
// CHECK:STDOUT: %impl.elem0.loc22_3.1: @F.%.loc22_3 (%.40e) = impl_witness_access constants.%Destroy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc22_3.2 (constants.%impl.elem0)]
// CHECK:STDOUT: %bound_method.loc22_3.1: <bound method> = bound_method %x.var, %impl.elem0.loc22_3.1
// CHECK:STDOUT: %specific_impl_fn.loc22_3.1: <specific function> = specific_impl_function %impl.elem0.loc22_3.1, @Destroy.WithSelf.Op(constants.%Destroy.facet) [symbolic = %specific_impl_fn.loc22_3.2 (constants.%specific_impl_fn)]
@@ -20,10 +20,10 @@ interface J {
}
// Simple member access.
fn Simple1(T:! J, S:! T.U) {}
fn Simple1(T:! J, unused S:! T.U) {}
// This should be equivalent to `Simple1` above, but using compound member access.
fn Compound1(V:! J, W:! V.(J.U)) {}
fn Compound1(V:! J, unused W:! V.(J.U)) {}
// --- non_instance.carbon
library "[[@TEST_NAME]]";
@@ -241,15 +241,15 @@ fn Works() {
// CHECK:STDOUT: %J.ref: type = name_ref J, file.%J.decl [concrete = constants.%J.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %T.loc8_12.2: %J.type = symbolic_binding T, 0 [symbolic = %T.loc8_12.1 (constants.%T)]
// CHECK:STDOUT: %.loc8_24.1: type = splice_block %impl.elem0.loc8_24.2 [symbolic = %impl.elem0.loc8_24.1 (constants.%impl.elem0.5607ef.1)] {
// CHECK:STDOUT: %.loc8_31.1: type = splice_block %impl.elem0.loc8_31.2 [symbolic = %impl.elem0.loc8_31.1 (constants.%impl.elem0.5607ef.1)] {
// CHECK:STDOUT: %.Self.1: %type = symbolic_binding .Self [symbolic_self = constants.%.Self]
// CHECK:STDOUT: %T.ref: %J.type = name_ref T, %T.loc8_12.2 [symbolic = %T.loc8_12.1 (constants.%T)]
// CHECK:STDOUT: %T.as_type: type = facet_access_type %T.ref [symbolic = %T.binding.as_type (constants.%T.binding.as_type)]
// CHECK:STDOUT: %.loc8_24.2: type = converted %T.ref, %T.as_type [symbolic = %T.binding.as_type (constants.%T.binding.as_type)]
// CHECK:STDOUT: %.loc8_31.2: type = converted %T.ref, %T.as_type [symbolic = %T.binding.as_type (constants.%T.binding.as_type)]
// CHECK:STDOUT: %U.ref: %J.assoc_type = name_ref U, @U.%assoc0 [concrete = constants.%assoc0]
// CHECK:STDOUT: %impl.elem0.loc8_24.2: type = impl_witness_access constants.%J.lookup_impl_witness.264a02.1, element0 [symbolic = %impl.elem0.loc8_24.1 (constants.%impl.elem0.5607ef.1)]
// CHECK:STDOUT: %impl.elem0.loc8_31.2: type = impl_witness_access constants.%J.lookup_impl_witness.264a02.1, element0 [symbolic = %impl.elem0.loc8_31.1 (constants.%impl.elem0.5607ef.1)]
// CHECK:STDOUT: }
// CHECK:STDOUT: %S.loc8_19.2: @Simple1.%impl.elem0.loc8_24.1 (%impl.elem0.5607ef.1) = symbolic_binding S, 1 [symbolic = %S.loc8_19.1 (constants.%S)]
// CHECK:STDOUT: %S.loc8_26.2: @Simple1.%impl.elem0.loc8_31.1 (%impl.elem0.5607ef.1) = symbolic_binding S, 1 [symbolic = %S.loc8_26.1 (constants.%S)]
// CHECK:STDOUT: }
// CHECK:STDOUT: %Compound1.decl: %Compound1.type = fn_decl @Compound1 [concrete = constants.%Compound1] {
// CHECK:STDOUT: %V.patt: %pattern_type.f76 = symbolic_binding_pattern V, 0 [concrete]
@@ -260,14 +260,14 @@ fn Works() {
// CHECK:STDOUT: %J.ref.loc11_18: type = name_ref J, file.%J.decl [concrete = constants.%J.type]
// CHECK:STDOUT: }
// CHECK:STDOUT: %V.loc11_14.2: %J.type = symbolic_binding V, 0 [symbolic = %V.loc11_14.1 (constants.%V)]
// CHECK:STDOUT: %.loc11_26: type = splice_block %impl.elem0.loc11_26.2 [symbolic = %impl.elem0.loc11_26.1 (constants.%impl.elem0.5607ef.2)] {
// CHECK:STDOUT: %.loc11_33: type = splice_block %impl.elem0.loc11_33.2 [symbolic = %impl.elem0.loc11_33.1 (constants.%impl.elem0.5607ef.2)] {
// CHECK:STDOUT: %.Self.1: %type = symbolic_binding .Self [symbolic_self = constants.%.Self]
// CHECK:STDOUT: %V.ref: %J.type = name_ref V, %V.loc11_14.2 [symbolic = %V.loc11_14.1 (constants.%V)]
// CHECK:STDOUT: %J.ref.loc11_28: type = name_ref J, file.%J.decl [concrete = constants.%J.type]
// CHECK:STDOUT: %J.ref.loc11_35: type = name_ref J, file.%J.decl [concrete = constants.%J.type]
// CHECK:STDOUT: %U.ref: %J.assoc_type = name_ref U, @U.%assoc0 [concrete = constants.%assoc0]
// CHECK:STDOUT: %impl.elem0.loc11_26.2: type = impl_witness_access constants.%J.lookup_impl_witness.264a02.2, element0 [symbolic = %impl.elem0.loc11_26.1 (constants.%impl.elem0.5607ef.2)]
// CHECK:STDOUT: %impl.elem0.loc11_33.2: type = impl_witness_access constants.%J.lookup_impl_witness.264a02.2, element0 [symbolic = %impl.elem0.loc11_33.1 (constants.%impl.elem0.5607ef.2)]
// CHECK:STDOUT: }
// CHECK:STDOUT: %W.loc11_21.2: @Compound1.%impl.elem0.loc11_26.1 (%impl.elem0.5607ef.2) = symbolic_binding W, 1 [symbolic = %W.loc11_21.1 (constants.%W)]
// CHECK:STDOUT: %W.loc11_28.2: @Compound1.%impl.elem0.loc11_33.1 (%impl.elem0.5607ef.2) = symbolic_binding W, 1 [symbolic = %W.loc11_28.1 (constants.%W)]
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -288,13 +288,13 @@ fn Works() {
// CHECK:STDOUT: !requires:
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic fn @Simple1(%T.loc8_12.2: %J.type, %S.loc8_19.2: @Simple1.%impl.elem0.loc8_24.1 (%impl.elem0.5607ef.1)) {
// CHECK:STDOUT: generic fn @Simple1(%T.loc8_12.2: %J.type, %S.loc8_26.2: @Simple1.%impl.elem0.loc8_31.1 (%impl.elem0.5607ef.1)) {
// CHECK:STDOUT: %T.loc8_12.1: %J.type = symbolic_binding T, 0 [symbolic = %T.loc8_12.1 (constants.%T)]
// CHECK:STDOUT: %T.binding.as_type: type = symbolic_binding_type T, 0, %T.loc8_12.1 [symbolic = %T.binding.as_type (constants.%T.binding.as_type)]
// CHECK:STDOUT: %J.lookup_impl_witness: <witness> = lookup_impl_witness %T.loc8_12.1, @J [symbolic = %J.lookup_impl_witness (constants.%J.lookup_impl_witness.264a02.1)]
// CHECK:STDOUT: %impl.elem0.loc8_24.1: type = impl_witness_access %J.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc8_24.1 (constants.%impl.elem0.5607ef.1)]
// CHECK:STDOUT: %S.loc8_19.1: @Simple1.%impl.elem0.loc8_24.1 (%impl.elem0.5607ef.1) = symbolic_binding S, 1 [symbolic = %S.loc8_19.1 (constants.%S)]
// CHECK:STDOUT: %pattern_type: type = pattern_type %impl.elem0.loc8_24.1 [symbolic = %pattern_type (constants.%pattern_type.ad6d12.1)]
// CHECK:STDOUT: %impl.elem0.loc8_31.1: type = impl_witness_access %J.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc8_31.1 (constants.%impl.elem0.5607ef.1)]
// CHECK:STDOUT: %S.loc8_26.1: @Simple1.%impl.elem0.loc8_31.1 (%impl.elem0.5607ef.1) = symbolic_binding S, 1 [symbolic = %S.loc8_26.1 (constants.%S)]
// CHECK:STDOUT: %pattern_type: type = pattern_type %impl.elem0.loc8_31.1 [symbolic = %pattern_type (constants.%pattern_type.ad6d12.1)]
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT:
@@ -304,12 +304,12 @@ fn Works() {
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic fn @Compound1(%V.loc11_14.2: %J.type, %W.loc11_21.2: @Compound1.%impl.elem0.loc11_26.1 (%impl.elem0.5607ef.2)) {
// CHECK:STDOUT: generic fn @Compound1(%V.loc11_14.2: %J.type, %W.loc11_28.2: @Compound1.%impl.elem0.loc11_33.1 (%impl.elem0.5607ef.2)) {
// CHECK:STDOUT: %V.loc11_14.1: %J.type = symbolic_binding V, 0 [symbolic = %V.loc11_14.1 (constants.%V)]
// CHECK:STDOUT: %J.lookup_impl_witness: <witness> = lookup_impl_witness %V.loc11_14.1, @J [symbolic = %J.lookup_impl_witness (constants.%J.lookup_impl_witness.264a02.2)]
// CHECK:STDOUT: %impl.elem0.loc11_26.1: type = impl_witness_access %J.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_26.1 (constants.%impl.elem0.5607ef.2)]
// CHECK:STDOUT: %W.loc11_21.1: @Compound1.%impl.elem0.loc11_26.1 (%impl.elem0.5607ef.2) = symbolic_binding W, 1 [symbolic = %W.loc11_21.1 (constants.%W)]
// CHECK:STDOUT: %pattern_type: type = pattern_type %impl.elem0.loc11_26.1 [symbolic = %pattern_type (constants.%pattern_type.ad6d12.2)]
// CHECK:STDOUT: %impl.elem0.loc11_33.1: type = impl_witness_access %J.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc11_33.1 (constants.%impl.elem0.5607ef.2)]
// CHECK:STDOUT: %W.loc11_28.1: @Compound1.%impl.elem0.loc11_33.1 (%impl.elem0.5607ef.2) = symbolic_binding W, 1 [symbolic = %W.loc11_28.1 (constants.%W)]
// CHECK:STDOUT: %pattern_type: type = pattern_type %impl.elem0.loc11_33.1 [symbolic = %pattern_type (constants.%pattern_type.ad6d12.2)]
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT:
@@ -331,8 +331,8 @@ fn Works() {
// CHECK:STDOUT: %T.loc8_12.1 => constants.%T
// CHECK:STDOUT: %T.binding.as_type => constants.%T.binding.as_type
// CHECK:STDOUT: %J.lookup_impl_witness => constants.%J.lookup_impl_witness.264a02.1
// CHECK:STDOUT: %impl.elem0.loc8_24.1 => constants.%impl.elem0.5607ef.1
// CHECK:STDOUT: %S.loc8_19.1 => constants.%S
// CHECK:STDOUT: %impl.elem0.loc8_31.1 => constants.%impl.elem0.5607ef.1
// CHECK:STDOUT: %S.loc8_26.1 => constants.%S
// CHECK:STDOUT: %pattern_type => constants.%pattern_type.ad6d12.1
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -343,8 +343,8 @@ fn Works() {
// CHECK:STDOUT: specific @Compound1(constants.%V, constants.%W) {
// CHECK:STDOUT: %V.loc11_14.1 => constants.%V
// CHECK:STDOUT: %J.lookup_impl_witness => constants.%J.lookup_impl_witness.264a02.2
// CHECK:STDOUT: %impl.elem0.loc11_26.1 => constants.%impl.elem0.5607ef.2
// CHECK:STDOUT: %W.loc11_21.1 => constants.%W
// CHECK:STDOUT: %impl.elem0.loc11_33.1 => constants.%impl.elem0.5607ef.2
// CHECK:STDOUT: %W.loc11_28.1 => constants.%W
// CHECK:STDOUT: %pattern_type => constants.%pattern_type.ad6d12.2
// CHECK:STDOUT: }
// CHECK:STDOUT:
+4 -4
View File
@@ -15,7 +15,7 @@
class C {
interface I {
// TODO: Use `default` here.
fn F[self: Self]() {
fn F[unused self: Self]() {
// I and F are both complete here, and the impl below is in scope.
var c: C = {};
c.(I.F)();
@@ -23,7 +23,7 @@ class C {
}
impl C as I {
fn F[self: Self]() {}
fn F[unused self: Self]() {}
}
}
@@ -86,10 +86,10 @@ class C {
// CHECK:STDOUT: %self.param_patt: @I.WithSelf.F.%pattern_type (%pattern_type.b59) = value_param_pattern %self.patt, call_param0 [concrete]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %self.param: @I.WithSelf.F.%Self.binding.as_type (%Self.binding.as_type.5c6) = value_param call_param0
// CHECK:STDOUT: %.loc18_16.1: type = splice_block %.loc18_16.2 [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.5c6)] {
// CHECK:STDOUT: %.loc18_23.1: type = splice_block %.loc18_23.2 [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.5c6)] {
// CHECK:STDOUT: %Self.ref: %I.type = name_ref Self, @I.%Self.loc16 [symbolic = %Self (constants.%Self.849)]
// CHECK:STDOUT: %Self.as_type: type = facet_access_type %Self.ref [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.5c6)]
// CHECK:STDOUT: %.loc18_16.2: type = converted %Self.ref, %Self.as_type [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.5c6)]
// CHECK:STDOUT: %.loc18_23.2: type = converted %Self.ref, %Self.as_type [symbolic = %Self.binding.as_type (constants.%Self.binding.as_type.5c6)]
// CHECK:STDOUT: }
// CHECK:STDOUT: %self: @I.WithSelf.F.%Self.binding.as_type (%Self.binding.as_type.5c6) = value_binding self, %self.param
// CHECK:STDOUT: }
+1 -1
View File
@@ -40,7 +40,7 @@ library "[[@TEST_NAME]]";
import library "export";
fn UseEmpty(i: I) {}
fn UseEmpty(unused i: I) {}
// CHECK:STDOUT: --- base.carbon
// CHECK:STDOUT:
@@ -28,14 +28,14 @@ fn F() {
// CHECK:STDERR:
Interface.F();
// CHECK:STDERR: fail_member_lookup.carbon:[[@LINE+7]]:10: error: cannot implicitly convert non-type value of type `<associated entity in Interface>` to `type` [ConversionFailureNonTypeToFacet]
// CHECK:STDERR: var v: Interface.T;
// CHECK:STDERR: ^~~~~~~~~~~
// CHECK:STDERR: fail_member_lookup.carbon:[[@LINE+4]]:10: note: type `<associated entity in Interface>` does not implement interface `Core.ImplicitAs(type)` [MissingImplInMemberAccessNote]
// CHECK:STDERR: var v: Interface.T;
// CHECK:STDERR: ^~~~~~~~~~~
// CHECK:STDERR: fail_member_lookup.carbon:[[@LINE+7]]:17: error: cannot implicitly convert non-type value of type `<associated entity in Interface>` to `type` [ConversionFailureNonTypeToFacet]
// CHECK:STDERR: var unused v: Interface.T;
// CHECK:STDERR: ^~~~~~~~~~~
// CHECK:STDERR: fail_member_lookup.carbon:[[@LINE+4]]:17: note: type `<associated entity in Interface>` does not implement interface `Core.ImplicitAs(type)` [MissingImplInMemberAccessNote]
// CHECK:STDERR: var unused v: Interface.T;
// CHECK:STDERR: ^~~~~~~~~~~
// CHECK:STDERR:
var v: Interface.T;
var unused v: Interface.T;
}
interface Different {}
@@ -52,7 +52,7 @@ interface Interface {
// TODO: This should be
// fn Interface.F[self: Self](U:! type, u: U*) -> U* { return u; }
fn Interface.C.F[self: Self](U:! type, u: U*) -> U* { return u; }
fn Interface.C.F[unused self: Self](U:! type, u: U*) -> U* { return u; }
// CHECK:STDOUT: --- fail_todo_define_default_fn_out_of_line.carbon
// CHECK:STDOUT:
@@ -239,21 +239,21 @@ fn Interface.C.F[self: Self](U:! type, u: U*) -> U* { return u; }
// CHECK:STDOUT: %return.patt: @C.F.%pattern_type.loc14_32 (%pattern_type.423) = return_slot_pattern [concrete]
// CHECK:STDOUT: %return.param_patt: @C.F.%pattern_type.loc14_32 (%pattern_type.423) = out_param_pattern %return.patt, call_param2 [concrete]
// CHECK:STDOUT: } {
// CHECK:STDOUT: %U.ref.loc20_50: type = name_ref U, %U.loc20 [symbolic = %U.loc14_22.1 (constants.%U.091)]
// CHECK:STDOUT: %ptr.loc20_51: type = ptr_type %U.ref.loc20_50 [symbolic = %ptr.loc14_36.1 (constants.%ptr.18e)]
// CHECK:STDOUT: %.loc20_51: Core.Form = init_form %ptr.loc20_51, call_param2 [symbolic = %.loc14_43.1 (constants.%.ddc)]
// CHECK:STDOUT: %U.ref.loc20_57: type = name_ref U, %U.loc20 [symbolic = %U.loc14_22.1 (constants.%U.091)]
// CHECK:STDOUT: %ptr.loc20_58: type = ptr_type %U.ref.loc20_57 [symbolic = %ptr.loc14_36.1 (constants.%ptr.18e)]
// CHECK:STDOUT: %.loc20_58: Core.Form = init_form %ptr.loc20_58, call_param2 [symbolic = %.loc14_43.1 (constants.%.ddc)]
// CHECK:STDOUT: %self.param.loc20: @C.F.%C (%C) = value_param call_param0
// CHECK:STDOUT: %.loc20_24.1: type = splice_block %Self.ref.loc20 [symbolic = %C (constants.%C)] {
// CHECK:STDOUT: %.loc20_24.2: type = specific_constant constants.%C, @C(constants.%Self.887) [symbolic = %C (constants.%C)]
// CHECK:STDOUT: %Self.ref.loc20: type = name_ref Self, %.loc20_24.2 [symbolic = %C (constants.%C)]
// CHECK:STDOUT: %.loc20_31.1: type = splice_block %Self.ref.loc20 [symbolic = %C (constants.%C)] {
// CHECK:STDOUT: %.loc20_31.2: type = specific_constant constants.%C, @C(constants.%Self.887) [symbolic = %C (constants.%C)]
// CHECK:STDOUT: %Self.ref.loc20: type = name_ref Self, %.loc20_31.2 [symbolic = %C (constants.%C)]
// CHECK:STDOUT: }
// CHECK:STDOUT: %self.loc20: @C.F.%C (%C) = value_binding self, %self.param.loc20
// CHECK:STDOUT: %.Self.2: %type = symbolic_binding .Self [symbolic_self = constants.%.Self]
// CHECK:STDOUT: %U.loc20: type = symbolic_binding U, 1 [symbolic = %U.loc14_22.1 (constants.%U.091)]
// CHECK:STDOUT: %u.param.loc20: @C.F.%ptr.loc14_36.1 (%ptr.18e) = value_param call_param1
// CHECK:STDOUT: %.loc20_44: type = splice_block %ptr.loc20_44 [symbolic = %ptr.loc14_36.1 (constants.%ptr.18e)] {
// CHECK:STDOUT: %U.ref.loc20_43: type = name_ref U, %U.loc20 [symbolic = %U.loc14_22.1 (constants.%U.091)]
// CHECK:STDOUT: %ptr.loc20_44: type = ptr_type %U.ref.loc20_43 [symbolic = %ptr.loc14_36.1 (constants.%ptr.18e)]
// CHECK:STDOUT: %.loc20_51: type = splice_block %ptr.loc20_51 [symbolic = %ptr.loc14_36.1 (constants.%ptr.18e)] {
// CHECK:STDOUT: %U.ref.loc20_50: type = name_ref U, %U.loc20 [symbolic = %U.loc14_22.1 (constants.%U.091)]
// CHECK:STDOUT: %ptr.loc20_51: type = ptr_type %U.ref.loc20_50 [symbolic = %ptr.loc14_36.1 (constants.%ptr.18e)]
// CHECK:STDOUT: }
// CHECK:STDOUT: %u.loc20: @C.F.%ptr.loc14_36.1 (%ptr.18e) = value_binding u, %u.param.loc20
// CHECK:STDOUT: %return.param.loc20: ref @C.F.%ptr.loc14_36.1 (%ptr.18e) = out_param call_param2
@@ -331,24 +331,24 @@ fn Interface.C.F[self: Self](U:! type, u: U*) -> U* { return u; }
// CHECK:STDOUT: %.loc14_43.1: Core.Form = init_form %ptr.loc14_36.1, call_param2 [symbolic = %.loc14_43.1 (constants.%.ddc)]
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT: %require_complete.loc20_22: <witness> = require_complete_type %C [symbolic = %require_complete.loc20_22 (constants.%require_complete.a31)]
// CHECK:STDOUT: %require_complete.loc20_41: <witness> = require_complete_type %ptr.loc14_36.1 [symbolic = %require_complete.loc20_41 (constants.%require_complete.56d)]
// CHECK:STDOUT: %.loc20_62.1: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%U.loc14_22.1) [symbolic = %.loc20_62.1 (constants.%.f1d)]
// CHECK:STDOUT: %require_complete.loc20_29: <witness> = require_complete_type %C [symbolic = %require_complete.loc20_29 (constants.%require_complete.a31)]
// CHECK:STDOUT: %require_complete.loc20_48: <witness> = require_complete_type %ptr.loc14_36.1 [symbolic = %require_complete.loc20_48 (constants.%require_complete.56d)]
// CHECK:STDOUT: %.loc20_69.1: require_specific_def_type = require_specific_def @ptr.as.Copy.impl(%U.loc14_22.1) [symbolic = %.loc20_69.1 (constants.%.f1d)]
// CHECK:STDOUT: %Copy.lookup_impl_witness: <witness> = lookup_impl_witness %ptr.loc14_36.1, @Copy [symbolic = %Copy.lookup_impl_witness (constants.%Copy.lookup_impl_witness.484)]
// CHECK:STDOUT: %Copy.facet: %Copy.type = facet_value %ptr.loc14_36.1, (%Copy.lookup_impl_witness) [symbolic = %Copy.facet (constants.%Copy.facet)]
// CHECK:STDOUT: %Copy.WithSelf.Op.type: type = fn_type @Copy.WithSelf.Op, @Copy(%Copy.facet) [symbolic = %Copy.WithSelf.Op.type (constants.%Copy.WithSelf.Op.type.be8)]
// CHECK:STDOUT: %.loc20_62.2: type = fn_type_with_self_type %Copy.WithSelf.Op.type, %Copy.facet [symbolic = %.loc20_62.2 (constants.%.e5c)]
// CHECK:STDOUT: %impl.elem0.loc20_62.2: @C.F.%.loc20_62.2 (%.e5c) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc20_62.2 (constants.%impl.elem0.375)]
// CHECK:STDOUT: %specific_impl_fn.loc20_62.2: <specific function> = specific_impl_function %impl.elem0.loc20_62.2, @Copy.WithSelf.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc20_62.2 (constants.%specific_impl_fn.389)]
// CHECK:STDOUT: %.loc20_69.2: type = fn_type_with_self_type %Copy.WithSelf.Op.type, %Copy.facet [symbolic = %.loc20_69.2 (constants.%.e5c)]
// CHECK:STDOUT: %impl.elem0.loc20_69.2: @C.F.%.loc20_69.2 (%.e5c) = impl_witness_access %Copy.lookup_impl_witness, element0 [symbolic = %impl.elem0.loc20_69.2 (constants.%impl.elem0.375)]
// CHECK:STDOUT: %specific_impl_fn.loc20_69.2: <specific function> = specific_impl_function %impl.elem0.loc20_69.2, @Copy.WithSelf.Op(%Copy.facet) [symbolic = %specific_impl_fn.loc20_69.2 (constants.%specific_impl_fn.389)]
// CHECK:STDOUT:
// CHECK:STDOUT: fn(%self.param.loc20: @C.F.%C (%C), %u.param.loc20: @C.F.%ptr.loc14_36.1 (%ptr.18e)) -> out %return.param.loc20: @C.F.%ptr.loc14_36.1 (%ptr.18e) {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %u.ref: @C.F.%ptr.loc14_36.1 (%ptr.18e) = name_ref u, %u.loc20
// CHECK:STDOUT: %impl.elem0.loc20_62.1: @C.F.%.loc20_62.2 (%.e5c) = impl_witness_access constants.%Copy.lookup_impl_witness.484, element0 [symbolic = %impl.elem0.loc20_62.2 (constants.%impl.elem0.375)]
// CHECK:STDOUT: %bound_method.loc20_62.1: <bound method> = bound_method %u.ref, %impl.elem0.loc20_62.1
// CHECK:STDOUT: %specific_impl_fn.loc20_62.1: <specific function> = specific_impl_function %impl.elem0.loc20_62.1, @Copy.WithSelf.Op(constants.%Copy.facet) [symbolic = %specific_impl_fn.loc20_62.2 (constants.%specific_impl_fn.389)]
// CHECK:STDOUT: %bound_method.loc20_62.2: <bound method> = bound_method %u.ref, %specific_impl_fn.loc20_62.1
// CHECK:STDOUT: %Copy.WithSelf.Op.call: init @C.F.%ptr.loc14_36.1 (%ptr.18e) = call %bound_method.loc20_62.2(%u.ref)
// CHECK:STDOUT: %impl.elem0.loc20_69.1: @C.F.%.loc20_69.2 (%.e5c) = impl_witness_access constants.%Copy.lookup_impl_witness.484, element0 [symbolic = %impl.elem0.loc20_69.2 (constants.%impl.elem0.375)]
// CHECK:STDOUT: %bound_method.loc20_69.1: <bound method> = bound_method %u.ref, %impl.elem0.loc20_69.1
// CHECK:STDOUT: %specific_impl_fn.loc20_69.1: <specific function> = specific_impl_function %impl.elem0.loc20_69.1, @Copy.WithSelf.Op(constants.%Copy.facet) [symbolic = %specific_impl_fn.loc20_69.2 (constants.%specific_impl_fn.389)]
// CHECK:STDOUT: %bound_method.loc20_69.2: <bound method> = bound_method %u.ref, %specific_impl_fn.loc20_69.1
// CHECK:STDOUT: %Copy.WithSelf.Op.call: init @C.F.%ptr.loc14_36.1 (%ptr.18e) = call %bound_method.loc20_69.2(%u.ref)
// CHECK:STDOUT: return %Copy.WithSelf.Op.call
// CHECK:STDOUT: }
// CHECK:STDOUT: }
+30 -22
View File
@@ -36,7 +36,7 @@ class C {
interface WithImplicitArgs[T:! type](N:! T);
fn Receive(T:! Simple(C)) {}
fn Receive(unused T:! Simple(C)) {}
fn Pass(T:! Simple(C)) {
Receive(T);
}
@@ -67,14 +67,14 @@ library "[[@TEST_NAME]]";
interface Generic(T:! type) {}
// CHECK:STDERR: fail_args_count_mismatch.carbon:[[@LINE+7]]:10: error: 2 arguments passed to generic interface expecting 1 argument [CallArgCountMismatch]
// CHECK:STDERR: fn F(T:! Generic((), ())) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~
// CHECK:STDERR: fail_args_count_mismatch.carbon:[[@LINE+7]]:17: error: 2 arguments passed to generic interface expecting 1 argument [CallArgCountMismatch]
// CHECK:STDERR: fn F(unused T:! Generic((), ())) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~
// CHECK:STDERR: fail_args_count_mismatch.carbon:[[@LINE-5]]:1: note: calling generic interface declared here [InCallToEntity]
// CHECK:STDERR: interface Generic(T:! type) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
fn F(T:! Generic((), ())) {}
fn F(unused T:! Generic((), ())) {}
// CHECK:STDOUT: --- generic.carbon
// CHECK:STDOUT:
@@ -124,13 +124,14 @@ fn F(T:! Generic((), ())) {}
// CHECK:STDOUT: %pattern_type.51d: type = pattern_type %T.67d [symbolic]
// CHECK:STDOUT: %WithImplicitArgs.type: type = generic_interface_type @WithImplicitArgs [concrete]
// CHECK:STDOUT: %WithImplicitArgs.generic: %WithImplicitArgs.type = struct_value () [concrete]
// CHECK:STDOUT: %T.760: %Simple.type.12a = symbolic_binding T, 0 [symbolic]
// CHECK:STDOUT: %T.7608f6.1: %Simple.type.12a = symbolic_binding T, 0 [symbolic]
// CHECK:STDOUT: %pattern_type.08a: type = pattern_type %Simple.type.12a [concrete]
// CHECK:STDOUT: %T.7608f6.2: %Simple.type.12a = symbolic_binding T, 0 [symbolic]
// CHECK:STDOUT: %Receive.type: type = fn_type @Receive [concrete]
// CHECK:STDOUT: %Receive: %Receive.type = struct_value () [concrete]
// CHECK:STDOUT: %Pass.type: type = fn_type @Pass [concrete]
// CHECK:STDOUT: %Pass: %Pass.type = struct_value () [concrete]
// CHECK:STDOUT: %Receive.specific_fn: <specific function> = specific_function %Receive, @Receive(%T.760) [symbolic]
// CHECK:STDOUT: %Receive.specific_fn: <specific function> = specific_function %Receive, @Receive(%T.7608f6.1) [symbolic]
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: file {
@@ -178,7 +179,7 @@ fn F(T:! Generic((), ())) {}
// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C]
// CHECK:STDOUT: %Simple.type: type = facet_type <@Simple, @Simple(constants.%C)> [concrete = constants.%Simple.type.12a]
// CHECK:STDOUT: }
// CHECK:STDOUT: %T.loc24_12.2: %Simple.type.12a = symbolic_binding T, 0 [symbolic = %T.loc24_12.1 (constants.%T.760)]
// CHECK:STDOUT: %T.loc24_19.3: %Simple.type.12a = symbolic_binding T, 0 [symbolic = %T.loc24_19.2 (constants.%T.7608f6.2)]
// CHECK:STDOUT: }
// CHECK:STDOUT: %Pass.decl: %Pass.type = fn_decl @Pass [concrete = constants.%Pass] {
// CHECK:STDOUT: %T.patt: %pattern_type.08a = symbolic_binding_pattern T, 0 [concrete]
@@ -189,7 +190,7 @@ fn F(T:! Generic((), ())) {}
// CHECK:STDOUT: %C.ref: type = name_ref C, file.%C.decl [concrete = constants.%C]
// CHECK:STDOUT: %Simple.type: type = facet_type <@Simple, @Simple(constants.%C)> [concrete = constants.%Simple.type.12a]
// CHECK:STDOUT: }
// CHECK:STDOUT: %T.loc25_9.2: %Simple.type.12a = symbolic_binding T, 0 [symbolic = %T.loc25_9.1 (constants.%T.760)]
// CHECK:STDOUT: %T.loc25_9.2: %Simple.type.12a = symbolic_binding T, 0 [symbolic = %T.loc25_9.1 (constants.%T.7608f6.1)]
// CHECK:STDOUT: }
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -325,8 +326,9 @@ fn F(T:! Generic((), ())) {}
// CHECK:STDOUT: return %.loc17_16 to %return.param
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic fn @Receive(%T.loc24_12.2: %Simple.type.12a) {
// CHECK:STDOUT: %T.loc24_12.1: %Simple.type.12a = symbolic_binding T, 0 [symbolic = %T.loc24_12.1 (constants.%T.760)]
// CHECK:STDOUT: generic fn @Receive(%T.loc24_19.3: %Simple.type.12a) {
// CHECK:STDOUT: %T.loc24_19.1: %Simple.type.12a = symbolic_binding T, 0 [symbolic = %T.loc24_19.1 (constants.%T.7608f6.1)]
// CHECK:STDOUT: %T.loc24_19.2: %Simple.type.12a = symbolic_binding T, 0 [symbolic = %T.loc24_19.2 (constants.%T.7608f6.2)]
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT:
@@ -337,7 +339,7 @@ fn F(T:! Generic((), ())) {}
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: generic fn @Pass(%T.loc25_9.2: %Simple.type.12a) {
// CHECK:STDOUT: %T.loc25_9.1: %Simple.type.12a = symbolic_binding T, 0 [symbolic = %T.loc25_9.1 (constants.%T.760)]
// CHECK:STDOUT: %T.loc25_9.1: %Simple.type.12a = symbolic_binding T, 0 [symbolic = %T.loc25_9.1 (constants.%T.7608f6.1)]
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT: %Receive.specific_fn.loc26_3.2: <specific function> = specific_function constants.%Receive, @Receive(%T.loc25_9.1) [symbolic = %Receive.specific_fn.loc26_3.2 (constants.%Receive.specific_fn)]
@@ -345,8 +347,8 @@ fn F(T:! Generic((), ())) {}
// CHECK:STDOUT: fn() {
// CHECK:STDOUT: !entry:
// CHECK:STDOUT: %Receive.ref: %Receive.type = name_ref Receive, file.%Receive.decl [concrete = constants.%Receive]
// CHECK:STDOUT: %T.ref: %Simple.type.12a = name_ref T, %T.loc25_9.2 [symbolic = %T.loc25_9.1 (constants.%T.760)]
// CHECK:STDOUT: %Receive.specific_fn.loc26_3.1: <specific function> = specific_function %Receive.ref, @Receive(constants.%T.760) [symbolic = %Receive.specific_fn.loc26_3.2 (constants.%Receive.specific_fn)]
// CHECK:STDOUT: %T.ref: %Simple.type.12a = name_ref T, %T.loc25_9.2 [symbolic = %T.loc25_9.1 (constants.%T.7608f6.1)]
// CHECK:STDOUT: %Receive.specific_fn.loc26_3.1: <specific function> = specific_function %Receive.ref, @Receive(constants.%T.7608f6.1) [symbolic = %Receive.specific_fn.loc26_3.2 (constants.%Receive.specific_fn)]
// CHECK:STDOUT: %Receive.call: init %empty_tuple.type = call %Receive.specific_fn.loc26_3.1()
// CHECK:STDOUT: return
// CHECK:STDOUT: }
@@ -420,14 +422,20 @@ fn F(T:! Generic((), ())) {}
// CHECK:STDOUT: %pattern_type => constants.%pattern_type.51d
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: specific @Receive(constants.%T.760) {
// CHECK:STDOUT: %T.loc24_12.1 => constants.%T.760
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT: specific @Receive(constants.%T.7608f6.2) {
// CHECK:STDOUT: %T.loc24_19.1 => constants.%T.7608f6.2
// CHECK:STDOUT: %T.loc24_19.2 => constants.%T.7608f6.2
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: specific @Pass(constants.%T.760) {
// CHECK:STDOUT: %T.loc25_9.1 => constants.%T.760
// CHECK:STDOUT: specific @Pass(constants.%T.7608f6.1) {
// CHECK:STDOUT: %T.loc25_9.1 => constants.%T.7608f6.1
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: specific @Receive(constants.%T.7608f6.1) {
// CHECK:STDOUT: %T.loc24_19.1 => constants.%T.7608f6.1
// CHECK:STDOUT: %T.loc24_19.2 => constants.%T.7608f6.1
// CHECK:STDOUT:
// CHECK:STDOUT: !definition:
// CHECK:STDOUT: }
// CHECK:STDOUT:
// CHECK:STDOUT: --- fail_mismatched_args.carbon
@@ -619,8 +627,8 @@ fn F(T:! Generic((), ())) {}
// CHECK:STDOUT: %.1: <error> = splice_block <error> [concrete = <error>] {
// CHECK:STDOUT: %.Self: %type = symbolic_binding .Self [symbolic_self = constants.%.Self]
// CHECK:STDOUT: %Generic.ref: %Generic.type.835 = name_ref Generic, file.%Generic.decl [concrete = constants.%Generic.generic]
// CHECK:STDOUT: %.loc12_19: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple]
// CHECK:STDOUT: %.loc12_23: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple]
// CHECK:STDOUT: %.loc12_26: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple]
// CHECK:STDOUT: %.loc12_30: %empty_tuple.type = tuple_literal () [concrete = constants.%empty_tuple]
// CHECK:STDOUT: }
// CHECK:STDOUT: %T: <error> = symbolic_binding T, 0 [concrete = <error>]
// CHECK:STDOUT: }
@@ -10,9 +10,11 @@
// TIP: To dump output, run:
// TIP: bazel run //toolchain/testing:file_test -- --dump_output --file_tests=toolchain/check/testdata/interface/generic_default_fn.carbon
interface I(T:! type) {
interface I(_:! type) {
// TODO: Use `default` here.
fn F[ref self: Self]() -> Self*;
}
fn I(T:! type).F[ref self: Self]() -> Self* { return &self; }
fn I(_:! type).F[ref self: Self]() -> Self* {
return &self;
}
+3 -3
View File
@@ -40,9 +40,9 @@ library "[[@TEST_NAME]]";
import library "a";
fn UseEmpty(e: Empty) {}
fn UseBasic(e: Basic) {}
fn UseForwardDeclared(f: ForwardDeclared) {}
fn UseEmpty(unused e: Empty) {}
fn UseBasic(unused e: Basic) {}
fn UseForwardDeclared(unused f: ForwardDeclared) {}
alias UseBasicT = Basic.T;
alias UseBasicF = Basic.F;
+33 -33
View File
@@ -45,7 +45,7 @@ package Test library "[[@TEST_NAME]]";
impl package Test library "[[@TEST_NAME]]";
fn F(i: Def) {}
fn F(unused i: Def) {}
// --- fail_local_def.carbon
@@ -53,11 +53,11 @@ package Test library "[[@TEST_NAME]]";
import library "def";
// CHECK:STDERR: fail_local_def.carbon:[[@LINE+4]]:9: error: name `Def` not found [NameNotFound]
// CHECK:STDERR: fn F(i: Def) {}
// CHECK:STDERR: ^~~
// CHECK:STDERR: fail_local_def.carbon:[[@LINE+4]]:16: error: name `Def` not found [NameNotFound]
// CHECK:STDERR: fn F(unused i: Def) {}
// CHECK:STDERR: ^~~
// CHECK:STDERR:
fn F(i: Def) {}
fn F(unused i: Def) {}
// --- fail_other_def.carbon
@@ -65,17 +65,17 @@ package Other library "[[@TEST_NAME]]";
import Test library "def";
// CHECK:STDERR: fail_other_def.carbon:[[@LINE+4]]:9: error: member name `Def` not found in `Test` [MemberNameNotFoundInInstScope]
// CHECK:STDERR: fn F(i: Test.Def) {}
// CHECK:STDERR: ^~~~~~~~
// CHECK:STDERR: fail_other_def.carbon:[[@LINE+4]]:16: error: member name `Def` not found in `Test` [MemberNameNotFoundInInstScope]
// CHECK:STDERR: fn F(unused i: Test.Def) {}
// CHECK:STDERR: ^~~~~~~~
// CHECK:STDERR:
fn F(i: Test.Def) {}
fn F(unused i: Test.Def) {}
// --- forward_with_def.impl.carbon
impl package Test library "[[@TEST_NAME]]";
fn F(i: ForwardWithDef) {}
fn F(unused i: ForwardWithDef) {}
// --- fail_local_forward_with_def.carbon
@@ -83,11 +83,11 @@ package Test library "[[@TEST_NAME]]";
import library "forward_with_def";
// CHECK:STDERR: fail_local_forward_with_def.carbon:[[@LINE+4]]:9: error: name `ForwardWithDef` not found [NameNotFound]
// CHECK:STDERR: fn F(i: ForwardWithDef) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~
// CHECK:STDERR: fail_local_forward_with_def.carbon:[[@LINE+4]]:16: error: name `ForwardWithDef` not found [NameNotFound]
// CHECK:STDERR: fn F(unused i: ForwardWithDef) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~
// CHECK:STDERR:
fn F(i: ForwardWithDef) {}
fn F(unused i: ForwardWithDef) {}
// --- fail_other_forward_with_def.carbon
@@ -95,24 +95,24 @@ package Other library "[[@TEST_NAME]]";
import Test library "forward_with_def";
// CHECK:STDERR: fail_other_forward_with_def.carbon:[[@LINE+4]]:9: error: member name `ForwardWithDef` not found in `Test` [MemberNameNotFoundInInstScope]
// CHECK:STDERR: fn F(i: Test.ForwardWithDef) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~
// CHECK:STDERR: fail_other_forward_with_def.carbon:[[@LINE+4]]:16: error: member name `ForwardWithDef` not found in `Test` [MemberNameNotFoundInInstScope]
// CHECK:STDERR: fn F(unused i: Test.ForwardWithDef) {}
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
fn F(i: Test.ForwardWithDef) {}
fn F(unused i: Test.ForwardWithDef) {}
// --- fail_todo_forward.impl.carbon
impl package Test library "[[@TEST_NAME]]";
// CHECK:STDERR: fail_todo_forward.impl.carbon:[[@LINE+7]]:9: error: name `Forward` not found [NameNotFound]
// CHECK:STDERR: fn F(i: Forward*) {}
// CHECK:STDERR: ^~~~~~~
// CHECK:STDERR: fail_todo_forward.impl.carbon:[[@LINE+7]]:16: error: name `Forward` not found [NameNotFound]
// CHECK:STDERR: fn F(unused i: Forward*) {}
// CHECK:STDERR: ^~~~~~~
// CHECK:STDERR:
// CHECK:STDERR: fail_todo_forward.impl.carbon:[[@LINE+3]]:9: error: name `Forward` used before it was declared [NameUseBeforeDecl]
// CHECK:STDERR: fn F(i: Forward*) {}
// CHECK:STDERR: ^~~~~~~
fn F(i: Forward*) {}
// CHECK:STDERR: fail_todo_forward.impl.carbon:[[@LINE+3]]:16: error: name `Forward` used before it was declared [NameUseBeforeDecl]
// CHECK:STDERR: fn F(unused i: Forward*) {}
// CHECK:STDERR: ^~~~~~~
fn F(unused i: Forward*) {}
// CHECK:STDERR: fail_todo_forward.impl.carbon:[[@LINE+4]]:11: note: declared here [NameUseBeforeDeclNote]
// CHECK:STDERR: interface Forward {}
@@ -126,11 +126,11 @@ package Test library "[[@TEST_NAME]]";
import library "forward";
// CHECK:STDERR: fail_local_forward.carbon:[[@LINE+4]]:9: error: name `Forward` not found [NameNotFound]
// CHECK:STDERR: fn F(i: Forward*) {}
// CHECK:STDERR: ^~~~~~~
// CHECK:STDERR: fail_local_forward.carbon:[[@LINE+4]]:16: error: name `Forward` not found [NameNotFound]
// CHECK:STDERR: fn F(unused i: Forward*) {}
// CHECK:STDERR: ^~~~~~~
// CHECK:STDERR:
fn F(i: Forward*) {}
fn F(unused i: Forward*) {}
// --- fail_other_forward.carbon
@@ -138,11 +138,11 @@ package Other library "[[@TEST_NAME]]";
import Test library "forward";
// CHECK:STDERR: fail_other_forward.carbon:[[@LINE+4]]:9: error: name `Forward` not found [NameNotFound]
// CHECK:STDERR: fn F(i: Forward*) {}
// CHECK:STDERR: ^~~~~~~
// CHECK:STDERR: fail_other_forward.carbon:[[@LINE+4]]:16: error: name `Forward` not found [NameNotFound]
// CHECK:STDERR: fn F(unused i: Forward*) {}
// CHECK:STDERR: ^~~~~~~
// CHECK:STDERR:
fn F(i: Forward*) {}
fn F(unused i: Forward*) {}
// --- todo_fail_private_on_redecl.carbon
+1 -1
View File
@@ -17,7 +17,7 @@ fn F() {
fn G[self: Self]();
}
impl () as I {
fn G[self: Self]() {}
fn G[unused self: Self]() {}
}
().(I.G)();
}
+1 -1
View File
@@ -19,7 +19,7 @@ interface I;
// `N.F` uses `N.I` and not `package.I`.
namespace N;
interface N.I {}
fn N.F(x:! I) {}
fn N.F(unused x:! I) {}
fn TestCall(x:! N.I) {
// `N.F` accepts an `N.I` not a `package.I`.