aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust
diff options
context:
space:
mode:
authorPhilip Herron <herron.philip@googlemail.com>2024-02-04 17:07:05 +0000
committerArthur Cohen <arthur.cohen@embecosm.com>2024-02-07 12:40:23 +0100
commit72a0554c7a269efeb6bb5462c3968f40fdf88fc2 (patch)
tree63516a847fe50c6b153f806f40fc19f6c9d1f77c /gcc/rust
parentae2f70932225634d38f8ee21a5d9bdcc91296425 (diff)
downloadgcc-72a0554c7a269efeb6bb5462c3968f40fdf88fc2.zip
gcc-72a0554c7a269efeb6bb5462c3968f40fdf88fc2.tar.gz
gcc-72a0554c7a269efeb6bb5462c3968f40fdf88fc2.tar.bz2
gccrs: fix bug in pattern check for tuples
We can point to generic parent types which means we need to do the shallow resolve thing that rustc does. We have destructure which is similar to get what the parameter type points to. Fixes #2775 gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-pattern.cc (TypeCheckPattern::visit): use destructure gcc/testsuite/ChangeLog: * rust/compile/issue-2775.rs: New test. Signed-off-by: Philip Herron <herron.philip@googlemail.com>
Diffstat (limited to 'gcc/rust')
-rw-r--r--gcc/rust/typecheck/rust-hir-type-check-pattern.cc6
1 files changed, 4 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 19f742f..c7f29e2 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc
@@ -302,7 +302,8 @@ TypeCheckPattern::visit (HIR::TuplePattern &pattern)
= *static_cast<HIR::TuplePatternItemsMultiple *> (
pattern.get_items ().get ());
- if (parent->get_kind () != TyTy::TUPLE)
+ auto resolved_parent = parent->destructure ();
+ if (resolved_parent->get_kind () != TyTy::TUPLE)
{
rust_error_at (pattern.get_locus (), "expected %s, found tuple",
parent->as_string ().c_str ());
@@ -312,7 +313,8 @@ TypeCheckPattern::visit (HIR::TuplePattern &pattern)
const auto &patterns = ref.get_patterns ();
size_t nitems_to_resolve = patterns.size ();
- TyTy::TupleType &par = *static_cast<TyTy::TupleType *> (parent);
+ TyTy::TupleType &par
+ = *static_cast<TyTy::TupleType *> (resolved_parent);
if (patterns.size () != par.get_fields ().size ())
{
emit_pattern_size_error (pattern, par.get_fields ().size (),