From 65b3a602928d723dcc7db946cf23d9a2846dc370 Mon Sep 17 00:00:00 2001 From: Yap Zhi Heng Date: Tue, 12 Aug 2025 21:58:18 +0800 Subject: [PATCH 1/2] gccrs: Implement let statement support for IdentifierPattern's subpatterns Trimmed GIMPLE code gen for let-identifierpattern-subpattern.rs ... RUSTTMP.1.__0 = 0; RUSTTMP.1.__1 = 2; RUSTTMP.1.__2 = 3; bar = RUSTTMP.1.__0; RUSTTMP.2 = RUSTTMP.1.__1; RUSTTMP.3 = RUSTTMP.1.__2; foo.__0 = 0; foo.__1 = 2; foo.__2 = 3; ret = 1; RUSTTMP.5 = foo; _1 = RUSTTMP.5.__0; _2 = _1 == 0; _3 = RUSTTMP.5.__1; _4 = _3 == 2; _5 = _2 & _4; _6 = RUSTTMP.5.__2; _7 = _6 == 3; _8 = _5 & _7; if (_8 != 0) goto ; else goto ; : { { ret = bar; } goto ; } ... gcc/rust/ChangeLog: * backend/rust-compile-pattern.cc(CompilePatternLet::visit(IdentifierPattern)): Add support for subpatterns. * backend/rust-compile-var-decl.h(CompileVarDecl::visit(IdentifierPattern)): Implement compilation for subpatterns. Signed-off-by: Yap Zhi Heng --- gcc/rust/backend/rust-compile-pattern.cc | 5 +++++ gcc/rust/backend/rust-compile-var-decl.h | 9 +++++++++ .../torture/let-identifierpattern-subpattern.rs | 11 +++++++++++ 3 files changed, 25 insertions(+) create mode 100644 gcc/testsuite/rust/execute/torture/let-identifierpattern-subpattern.rs diff --git a/gcc/rust/backend/rust-compile-pattern.cc b/gcc/rust/backend/rust-compile-pattern.cc index 16f8b52679c1..577f8de9c93b 100644 --- a/gcc/rust/backend/rust-compile-pattern.cc +++ b/gcc/rust/backend/rust-compile-pattern.cc @@ -992,6 +992,11 @@ CompilePatternLet::visit (HIR::IdentifierPattern &pattern) } else { + if (pattern.has_subpattern ()) + { + CompilePatternLet::Compile (&pattern.get_subpattern (), init_expr, ty, + rval_locus, ctx); + } auto s = Backend::init_statement (fnctx.fndecl, var, init_expr); ctx->add_statement (s); } diff --git a/gcc/rust/backend/rust-compile-var-decl.h b/gcc/rust/backend/rust-compile-var-decl.h index 4ab02a8b760d..15f3ebb3a6a7 100644 --- a/gcc/rust/backend/rust-compile-var-decl.h +++ b/gcc/rust/backend/rust-compile-var-decl.h @@ -64,6 +64,15 @@ class CompileVarDecl : public HIRCompileBase, public HIR::HIRPatternVisitor ctx->insert_var_decl (stmt_id, var); vars.push_back (var); + + if (pattern.has_subpattern ()) + { + auto subpattern_vars + = CompileVarDecl::compile (fndecl, translated_type, + &pattern.get_subpattern (), ctx); + vars.insert (vars.end (), subpattern_vars.begin (), + subpattern_vars.end ()); + } } void visit (HIR::TuplePattern &pattern) override diff --git a/gcc/testsuite/rust/execute/torture/let-identifierpattern-subpattern.rs b/gcc/testsuite/rust/execute/torture/let-identifierpattern-subpattern.rs new file mode 100644 index 000000000000..fa1f56e60b5c --- /dev/null +++ b/gcc/testsuite/rust/execute/torture/let-identifierpattern-subpattern.rs @@ -0,0 +1,11 @@ +fn main() -> i32 { + let foo @ (bar, _, _) = (0, 2, 3); + let mut ret = 1; + + match foo { + (0, 2, 3) => { ret = bar }, + _ => {} + } + + ret +} \ No newline at end of file From fc9502da1cc1b28052349b2b6fb00f450010d9db Mon Sep 17 00:00:00 2001 From: Yap Zhi Heng Date: Tue, 12 Aug 2025 22:02:08 +0800 Subject: [PATCH 2/2] gccrs: Add IdentifierPattern subpattern support for ClosureParamInfer gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-pattern.cc(ClosureParamInfer(IdentifierPattern)): Resolve subpattern types for IdentifierPattern. Signed-off-by: Yap Zhi Heng --- gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc index 0930c2233e63..b34679eb6b40 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc @@ -814,6 +814,11 @@ ClosureParamInfer::visit (HIR::WildcardPattern &pattern) void ClosureParamInfer::visit (HIR::IdentifierPattern &pattern) { + if (pattern.has_subpattern ()) + { + ClosureParamInfer::Resolve (pattern.get_subpattern ()); + } + HirId id = pattern.get_mappings ().get_hirid (); infered = new TyTy::InferType (id, TyTy::InferType::InferTypeKind::GENERAL, TyTy::InferType::TypeHint::Default (),