https://gcc.gnu.org/g:0803c00cdddb88bf9cfca5ad1958105d66cf04c7
commit r16-2911-g0803c00cdddb88bf9cfca5ad1958105d66cf04c7 Author: Zhi Heng <yapz...@gmail.com> Date: Sat Jun 28 20:59:54 2025 +0800 gccrs: Fix type checking logic for TuplePattern gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-pattern.cc (visit(TuplePattern)): Fix incorrect logic for field size checking. gcc/testsuite/ChangeLog: * rust/compile/tuple_mismatch.rs: Include RestPattern in test. Signed-off-by: Yap Zhi Heng <yapz...@gmail.com> Diff: --- gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 4 ++-- gcc/testsuite/rust/compile/tuple_mismatch.rs | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc index d87916ec7985..537c3491265b 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc @@ -511,12 +511,12 @@ TypeCheckPattern::visit (HIR::TuplePattern &pattern) HIR::TuplePatternItemsRanged &ref = static_cast<HIR::TuplePatternItemsRanged &> (pattern.get_items ()); - // Check whether size of lower and upper patterns <= parent size const auto &lower = ref.get_lower_patterns (); const auto &upper = ref.get_upper_patterns (); size_t min_size_required = lower.size () + upper.size (); - if (par.get_fields ().size () > min_size_required) + // Ensure that size of lower and upper patterns <= parent size + if (min_size_required > par.get_fields ().size ()) { emit_pattern_size_error (pattern, par.get_fields ().size (), min_size_required); diff --git a/gcc/testsuite/rust/compile/tuple_mismatch.rs b/gcc/testsuite/rust/compile/tuple_mismatch.rs index 828586b0f09d..1ff358be60a1 100644 --- a/gcc/testsuite/rust/compile/tuple_mismatch.rs +++ b/gcc/testsuite/rust/compile/tuple_mismatch.rs @@ -3,6 +3,7 @@ fn main() { let (_,) = (1, 2); // { dg-error "expected a tuple with 2 elements, found one with 1 element" } let (_, _) = (1, 2, 3); // { dg-error "expected a tuple with 3 elements, found one with 2 elements" } let (_, _) = (1,); // { dg-error "expected a tuple with 1 element, found one with 2 elements" } + let (_, .., _) = (1,); // { dg-error "expected a tuple with 1 element, found one with 2 elements" } } // The lhs and rhs sizes don't match, but we still resolve 'a' to be bool, we don't