From fe8d5b1635c048caf4d85813b770dd1d9fe938c8 Mon Sep 17 00:00:00 2001 From: Arthur Cohen Date: Fri, 29 Aug 2025 15:35:33 +0200 Subject: [PATCH] nr2.0: Add extra check when resolving identifier patterns gcc/rust/ChangeLog: * resolve/rust-late-name-resolver-2.0.cc (Late::visit): Check if an identifier pattern can be resolved in the types namespace before visiting it as an identifier proper. gcc/testsuite/ChangeLog: * rust/compile/issue-4116.rs: New test. --- gcc/rust/resolve/rust-late-name-resolver-2.0.cc | 10 ++++++++++ gcc/testsuite/rust/compile/issue-4116.rs | 16 ++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/rust/compile/issue-4116.rs diff --git a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc index 6effb7af42f1..9915d89b4679 100644 --- a/gcc/rust/resolve/rust-late-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-late-name-resolver-2.0.cc @@ -206,6 +206,16 @@ Late::visit (AST::IdentifierPattern &identifier) { DefaultResolver::visit (identifier); + // We need to check if the Identifier resolves to a variant or empty struct + auto path = AST::SimplePath (identifier.get_ident ()); + + if (auto resolved = ctx.resolve_path (path, Namespace::Types)) + { + ctx.map_usage (Usage (identifier.get_node_id ()), + Definition (resolved->get_node_id ())); + return; + } + visit_identifier_as_pattern (ctx, identifier.get_ident (), identifier.get_locus (), identifier.get_node_id (), diff --git a/gcc/testsuite/rust/compile/issue-4116.rs b/gcc/testsuite/rust/compile/issue-4116.rs new file mode 100644 index 000000000000..52b34b575acd --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-4116.rs @@ -0,0 +1,16 @@ +enum Foo { + Relaxed, + SeqCst, + StressedOut, +} + +use Foo::{Relaxed, SeqCst, StressedOut}; + +fn main() { + let a = (Relaxed, Relaxed); + + match a { + (Relaxed, Relaxed) => {} + _ => {} + } +}