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) => {} + _ => {} + } +}