aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-08-19 14:12:15 +0000
committerGitHub <noreply@github.com>2022-08-19 14:12:15 +0000
commitabfd358d756b409ce657761d320b04b9383cbfd8 (patch)
tree67ed721a0b6b9d76096a031bac42763aa918a3bb /gcc
parent5391805604332dc11d3b63bf2e4501b59f478524 (diff)
parent6758b6c5b0a09dd265f124b3b0ac6ad0443e246e (diff)
downloadgcc-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.cc13
-rw-r--r--gcc/testsuite/rust/compile/match7.rs12
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);
+}