From 6758b6c5b0a09dd265f124b3b0ac6ad0443e246e Mon Sep 17 00:00:00 2001 From: David Faust Date: Thu, 18 Aug 2022 08:54:27 -0700 Subject: typecheck: resolve tuple elt against parent elt When doing type resolution for an element of a tuple pattern, check it against the corresponding element of the parent, if the parent is also a tuple. --- gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 13 +++++++++++-- gcc/testsuite/rust/compile/match7.rs | 12 ++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/rust/compile/match7.rs (limited to 'gcc') diff --git a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc index a62fbc9..429511d 100644 --- a/gcc/rust/typecheck/rust-hir-type-check-pattern.cc +++ b/gcc/rust/typecheck/rust-hir-type-check-pattern.cc @@ -263,9 +263,18 @@ TypeCheckPattern::visit (HIR::TuplePattern &pattern) pattern.get_items ().get ()); std::vector pattern_elems; - for (auto &p : ref.get_patterns ()) + for (size_t i = 0; i < ref.get_patterns ().size (); i++) { - TyTy::BaseType *elem = TypeCheckPattern::Resolve (p.get (), parent); + auto &p = ref.get_patterns ()[i]; + TyTy::BaseType *par_type = parent; + if (parent->get_kind () == TyTy::TUPLE) + { + TyTy::TupleType &par = *static_cast (parent); + par_type = par.get_field (i); + } + + TyTy::BaseType *elem + = TypeCheckPattern::Resolve (p.get (), par_type); pattern_elems.push_back (TyTy::TyVar (elem->get_ref ())); } infered diff --git a/gcc/testsuite/rust/compile/match7.rs b/gcc/testsuite/rust/compile/match7.rs new file mode 100644 index 0000000..b16a188 --- /dev/null +++ b/gcc/testsuite/rust/compile/match7.rs @@ -0,0 +1,12 @@ +fn bar (x: u8, y: u8) -> i32 { + match (x, y) { + (1, 1) => { return 1; } + (1, _) => { return -1; } + } + + return 0; +} + +fn main () -> () { + bar (1, 2); +} -- cgit v1.1