Skip to content

Commit 0db7472

Browse files
Polygonalrphilberty
authored andcommitted
Attempt to resolve pattern items in tuple pattern with a rest pattern
gcc/rust/ChangeLog: * typecheck/rust-hir-type-check-pattern.cc (visit(TuplePattern)): Update HAS_REST case to continue to attempt to resolve pattern items after emitting size error. Signed-off-by: Yap Zhi Heng <[email protected]>
1 parent 10ee102 commit 0db7472

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

gcc/rust/typecheck/rust-hir-type-check-pattern.cc

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -657,14 +657,14 @@ TypeCheckPattern::visit (HIR::TuplePattern &pattern)
657657
{
658658
emit_pattern_size_error (pattern, par.get_fields ().size (),
659659
min_size_required);
660-
// TODO attempt to continue to do typechecking even after wrong
661-
// size
662-
break;
660+
// continue and attempt to resolve individual items in the pattern
663661
}
664662

665663
// Resolve lower patterns
666664
std::vector<TyTy::TyVar> pattern_elems;
667-
for (size_t i = 0; i < lower.size (); i++)
665+
size_t nlower_items_to_resolve
666+
= std::min (lower.size (), par.get_fields ().size ());
667+
for (size_t i = 0; i < nlower_items_to_resolve; i++)
668668
{
669669
auto &p = lower[i];
670670
TyTy::BaseType *par_type = par.get_field (i);
@@ -673,16 +673,23 @@ TypeCheckPattern::visit (HIR::TuplePattern &pattern)
673673
pattern_elems.emplace_back (elem->get_ref ());
674674
}
675675

676+
if (lower.size () > par.get_fields ().size ())
677+
break;
678+
676679
// Pad pattern_elems until needing to resolve upper patterns
677-
size_t rest_end = par.get_fields ().size () - upper.size ();
680+
size_t rest_end
681+
= std::max (par.get_fields ().size () - upper.size (), lower.size ());
678682
for (size_t i = lower.size (); i < rest_end; i++)
679683
{
680684
TyTy::BaseType *par_type = par.get_field (i);
681685
pattern_elems.emplace_back (par_type->get_ref ());
682686
}
683687

688+
size_t nupper_items_to_resolve
689+
= std::min (upper.size (),
690+
par.get_fields ().size () - pattern_elems.size ());
684691
// Resolve upper patterns
685-
for (size_t i = 0; i < upper.size (); i++)
692+
for (size_t i = 0; i < nupper_items_to_resolve; i++)
686693
{
687694
auto &p = upper[i];
688695
TyTy::BaseType *par_type = par.get_field (rest_end + i);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
fn main() {
2+
match (1, 2.2, "not 3") {
3+
// { dg-error "expected a tuple with 3 elements, found one with 5 elements" "" { target *-*-* } .+1 }
4+
(a, b, .., c, d, e) => {
5+
let _ = b + c; // { dg-error "cannot apply operator .+. to types <float> and & str" }
6+
}
7+
}
8+
}

0 commit comments

Comments
 (0)