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
+32 -32
View File
@@ -30,9 +30,9 @@ library "[[@TEST_NAME]]";
import Cpp library "global_scope.h";
fn MyF() {
let local: Cpp.C = Cpp.global;
let local_ptr: Cpp.C* = Cpp.global_ptr;
let local_ref: Cpp.C* = Cpp.global_ref;
let unused local: Cpp.C = Cpp.global;
let unused local_ptr: Cpp.C* = Cpp.global_ptr;
let unused local_ref: Cpp.C* = Cpp.global_ref;
}
// ============================================================================
@@ -55,18 +55,18 @@ library "[[@TEST_NAME]]";
import Cpp library "unsupported_type.h";
fn MyF() {
// CHECK:STDERR: fail_import_unsupported_type.carbon:[[@LINE+11]]:14: note: in `Cpp` name lookup for `UnusupportedType` [InCppNameLookup]
// CHECK:STDERR: let local: Cpp.UnusupportedType = Cpp.global;
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR: fail_import_unsupported_type.carbon:[[@LINE+11]]:21: note: in `Cpp` name lookup for `UnusupportedType` [InCppNameLookup]
// CHECK:STDERR: let unused local: Cpp.UnusupportedType = Cpp.global;
// CHECK:STDERR: ^~~~~~~~~~~~~~~~~~~~
// CHECK:STDERR:
// CHECK:STDERR: fail_import_unsupported_type.carbon:[[@LINE+7]]:37: error: semantics TODO: `Unsupported: var type: UnusupportedType` [SemanticsTodo]
// CHECK:STDERR: let local: Cpp.UnusupportedType = Cpp.global;
// CHECK:STDERR: ^~~~~~~~~~
// CHECK:STDERR: fail_import_unsupported_type.carbon:[[@LINE+4]]:37: note: in `Cpp` name lookup for `global` [InCppNameLookup]
// CHECK:STDERR: let local: Cpp.UnusupportedType = Cpp.global;
// CHECK:STDERR: ^~~~~~~~~~
// CHECK:STDERR: fail_import_unsupported_type.carbon:[[@LINE+7]]:44: error: semantics TODO: `Unsupported: var type: UnusupportedType` [SemanticsTodo]
// CHECK:STDERR: let unused local: Cpp.UnusupportedType = Cpp.global;
// CHECK:STDERR: ^~~~~~~~~~
// CHECK:STDERR: fail_import_unsupported_type.carbon:[[@LINE+4]]:44: note: in `Cpp` name lookup for `global` [InCppNameLookup]
// CHECK:STDERR: let unused local: Cpp.UnusupportedType = Cpp.global;
// CHECK:STDERR: ^~~~~~~~~~
// CHECK:STDERR:
let local: Cpp.UnusupportedType = Cpp.global;
let unused local: Cpp.UnusupportedType = Cpp.global;
}
// CHECK:STDOUT: --- import_global_scope.carbon
@@ -136,40 +136,40 @@ fn MyF() {
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %local.patt: %pattern_type.217 = value_binding_pattern local [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT: %Cpp.ref.loc7_22: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %Cpp.ref.loc7_29: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %global.ref: ref %C = name_ref global, imports.%global.var [concrete = imports.%global.var]
// CHECK:STDOUT: %.loc7_17: type = splice_block %C.ref.loc7 [concrete = constants.%C] {
// CHECK:STDOUT: %Cpp.ref.loc7_14: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %.loc7_24: type = splice_block %C.ref.loc7 [concrete = constants.%C] {
// CHECK:STDOUT: %Cpp.ref.loc7_21: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %C.ref.loc7: type = name_ref C, imports.%C.decl [concrete = constants.%C]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc7_25: %C = acquire_value %global.ref
// CHECK:STDOUT: %local: %C = value_binding local, %.loc7_25
// CHECK:STDOUT: %.loc7_32: %C = acquire_value %global.ref
// CHECK:STDOUT: %local: %C = value_binding local, %.loc7_32
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %local_ptr.patt: %pattern_type.a31 = value_binding_pattern local_ptr [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT: %Cpp.ref.loc8_27: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %Cpp.ref.loc8_34: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %global_ptr.ref: ref %ptr.d9e = name_ref global_ptr, imports.%global_ptr.var [concrete = imports.%global_ptr.var]
// CHECK:STDOUT: %.loc8_23: type = splice_block %ptr.loc8 [concrete = constants.%ptr.d9e] {
// CHECK:STDOUT: %Cpp.ref.loc8_18: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %.loc8_30: type = splice_block %ptr.loc8 [concrete = constants.%ptr.d9e] {
// CHECK:STDOUT: %Cpp.ref.loc8_25: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %C.ref.loc8: type = name_ref C, imports.%C.decl [concrete = constants.%C]
// CHECK:STDOUT: %ptr.loc8: type = ptr_type %C.ref.loc8 [concrete = constants.%ptr.d9e]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc8_30: %ptr.d9e = acquire_value %global_ptr.ref
// CHECK:STDOUT: %local_ptr: %ptr.d9e = value_binding local_ptr, %.loc8_30
// CHECK:STDOUT: %.loc8_37: %ptr.d9e = acquire_value %global_ptr.ref
// CHECK:STDOUT: %local_ptr: %ptr.d9e = value_binding local_ptr, %.loc8_37
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %local_ref.patt: %pattern_type.a31 = value_binding_pattern local_ref [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT: %Cpp.ref.loc9_27: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %Cpp.ref.loc9_34: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %global_ref.ref: ref %const = name_ref global_ref, imports.%global_ref.var [concrete = imports.%global_ref.var]
// CHECK:STDOUT: %.loc9_23: type = splice_block %ptr.loc9 [concrete = constants.%ptr.d9e] {
// CHECK:STDOUT: %Cpp.ref.loc9_18: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %.loc9_30: type = splice_block %ptr.loc9 [concrete = constants.%ptr.d9e] {
// CHECK:STDOUT: %Cpp.ref.loc9_25: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %C.ref.loc9: type = name_ref C, imports.%C.decl [concrete = constants.%C]
// CHECK:STDOUT: %ptr.loc9: type = ptr_type %C.ref.loc9 [concrete = constants.%ptr.d9e]
// CHECK:STDOUT: }
// CHECK:STDOUT: %.loc9_30.1: ref %ptr.d9e = as_compatible %global_ref.ref [concrete = constants.%global_ref.var]
// CHECK:STDOUT: %.loc9_30.2: ref %ptr.d9e = converted %global_ref.ref, %.loc9_30.1 [concrete = constants.%global_ref.var]
// CHECK:STDOUT: %.loc9_30.3: %ptr.d9e = acquire_value %.loc9_30.2
// CHECK:STDOUT: %local_ref: %ptr.d9e = value_binding local_ref, %.loc9_30.3
// CHECK:STDOUT: %.loc9_37.1: ref %ptr.d9e = as_compatible %global_ref.ref [concrete = constants.%global_ref.var]
// CHECK:STDOUT: %.loc9_37.2: ref %ptr.d9e = converted %global_ref.ref, %.loc9_37.1 [concrete = constants.%global_ref.var]
// CHECK:STDOUT: %.loc9_37.3: %ptr.d9e = acquire_value %.loc9_37.2
// CHECK:STDOUT: %local_ref: %ptr.d9e = value_binding local_ref, %.loc9_37.3
// CHECK:STDOUT: return
// CHECK:STDOUT: }
// CHECK:STDOUT:
@@ -210,10 +210,10 @@ fn MyF() {
// CHECK:STDOUT: name_binding_decl {
// CHECK:STDOUT: %local.patt: <error> = value_binding_pattern local [concrete]
// CHECK:STDOUT: }
// CHECK:STDOUT: %Cpp.ref.loc22_37: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %Cpp.ref.loc22_44: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %global.ref: <error> = name_ref global, <error> [concrete = <error>]
// CHECK:STDOUT: %.1: <error> = splice_block <error> [concrete = <error>] {
// CHECK:STDOUT: %Cpp.ref.loc22_14: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %Cpp.ref.loc22_21: <namespace> = name_ref Cpp, imports.%Cpp [concrete = imports.%Cpp]
// CHECK:STDOUT: %UnusupportedType.ref: <error> = name_ref UnusupportedType, <error> [concrete = <error>]
// CHECK:STDOUT: }
// CHECK:STDOUT: %local: <error> = value_binding local, <error> [concrete = <error>]
+1 -1
View File
@@ -24,7 +24,7 @@ library "[[@TEST_NAME]]";
import Cpp library "namespace.h";
fn MyF() {
let local: Cpp.N.C = Cpp.N.global;
let unused local: Cpp.N.C = Cpp.N.global;
}
// --- type_in_namespace.carbon