diff options
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-2775.rs | 11 |
2 files changed, 15 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 (), diff --git a/gcc/testsuite/rust/compile/issue-2775.rs b/gcc/testsuite/rust/compile/issue-2775.rs new file mode 100644 index 0000000..3ad7085 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-2775.rs @@ -0,0 +1,11 @@ +// { dg-options "-w" } +#[lang = "sized"] +pub trait Sized {} + +struct Ref<'a, T> { + x: &'a T, +} + +pub fn test<'a, 'b, 'c>() { + let (_, &&Ref::<(&'_ i32, i32)> { x: &(a, b) }): (i32, &'_ &'b Ref<'b, (&'c i32, i32)>); +} |