mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 13:11:05 +01:00
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:
co-authored by
Burak Emir
jonmeow
parent
bea24a8bee
commit
fdb188ccfd
+1
-1
@@ -14,7 +14,7 @@
|
||||
|
||||
interface Empty {}
|
||||
|
||||
fn F(e: Empty) {}
|
||||
fn F(unused e: Empty) {}
|
||||
|
||||
// CHECK:STDOUT: --- as_type.carbon
|
||||
// CHECK:STDOUT:
|
||||
|
||||
+11
-11
@@ -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
@@ -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
@@ -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 {}
|
||||
|
||||
+21
-21
@@ -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
@@ -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
@@ -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
@@ -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
@@ -17,7 +17,7 @@ fn F() {
|
||||
fn G[self: Self]();
|
||||
}
|
||||
impl () as I {
|
||||
fn G[self: Self]() {}
|
||||
fn G[unused self: Self]() {}
|
||||
}
|
||||
().(I.G)();
|
||||
}
|
||||
|
||||
@@ -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`.
|
||||
|
||||
Reference in New Issue
Block a user