diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2022-08-19 14:12:15 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-19 14:12:15 +0000 |
commit | abfd358d756b409ce657761d320b04b9383cbfd8 (patch) | |
tree | 67ed721a0b6b9d76096a031bac42763aa918a3bb /gcc/rust | |
parent | 5391805604332dc11d3b63bf2e4501b59f478524 (diff) | |
parent | 6758b6c5b0a09dd265f124b3b0ac6ad0443e246e (diff) | |
download | gcc-abfd358d756b409ce657761d320b04b9383cbfd8.zip gcc-abfd358d756b409ce657761d320b04b9383cbfd8.tar.gz gcc-abfd358d756b409ce657761d320b04b9383cbfd8.tar.bz2 |
Merge #1491
1491: typecheck: resolve tuple pattern elt against parent elt r=philberty a=dafaust
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.
Fixes: #1476
Co-authored-by: David Faust <david.faust@oracle.com>
Diffstat (limited to 'gcc/rust')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 13 |
1 files changed, 11 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 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<TyTy::TyVar> 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<TyTy::TupleType *> (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 |