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 | |
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')
-rw-r--r-- | gcc/rust/typecheck/rust-hir-type-check-pattern.cc | 13 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/match7.rs | 12 |
2 files changed, 23 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 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); +} |