@@ -358,8 +358,42 @@ CompilePatternCheckExpr::visit (HIR::TupleStructPattern &pattern)
358
358
{
359
359
case HIR::TupleStructItems::HAS_REST:
360
360
{
361
- // TODO
362
- rust_unreachable ();
361
+ HIR::TupleStructItemsHasRest &items_has_rest
362
+ = static_cast <HIR::TupleStructItemsHasRest &> (items);
363
+ size_t num_patterns = items_has_rest.get_lower_patterns ().size ()
364
+ + items_has_rest.get_upper_patterns ().size ();
365
+
366
+ // enums cases shouldn't reach here
367
+ rust_assert (num_patterns <= variant->num_fields ()
368
+ && (!adt->is_enum ()));
369
+
370
+ size_t tuple_field_index = 0 ;
371
+ for (auto &pattern : items_has_rest.get_lower_patterns ())
372
+ {
373
+ tree field_expr
374
+ = Backend::struct_field_expression (match_scrutinee_expr,
375
+ tuple_field_index++,
376
+ pattern->get_locus ());
377
+ tree check_expr_sub
378
+ = CompilePatternCheckExpr::Compile (*pattern, field_expr, ctx);
379
+ check_expr = Backend::arithmetic_or_logical_expression (
380
+ ArithmeticOrLogicalOperator::BITWISE_AND, check_expr,
381
+ check_expr_sub, pattern->get_locus ());
382
+ }
383
+ tuple_field_index = variant->num_fields ()
384
+ - items_has_rest.get_upper_patterns ().size ();
385
+ for (auto &pattern : items_has_rest.get_upper_patterns ())
386
+ {
387
+ tree field_expr
388
+ = Backend::struct_field_expression (match_scrutinee_expr,
389
+ tuple_field_index++,
390
+ pattern->get_locus ());
391
+ tree check_expr_sub
392
+ = CompilePatternCheckExpr::Compile (*pattern, field_expr, ctx);
393
+ check_expr = Backend::arithmetic_or_logical_expression (
394
+ ArithmeticOrLogicalOperator::BITWISE_AND, check_expr,
395
+ check_expr_sub, pattern->get_locus ());
396
+ }
363
397
}
364
398
break ;
365
399
@@ -738,23 +772,52 @@ CompilePatternBindings::visit (HIR::TupleStructPattern &pattern)
738
772
{
739
773
case HIR::TupleStructItems::HAS_REST:
740
774
{
741
- // TODO
742
- rust_unreachable ();
775
+ HIR::TupleStructItemsHasRest &items_has_rest
776
+ = static_cast <HIR::TupleStructItemsHasRest &> (items);
777
+ size_t num_patterns = items_has_rest.get_lower_patterns ().size ()
778
+ + items_has_rest.get_upper_patterns ().size ();
779
+
780
+ // enums cases shouldn't reach here
781
+ rust_assert (num_patterns <= variant->num_fields ()
782
+ && (!adt->is_enum ()));
783
+
784
+ size_t tuple_field_index = 0 ;
785
+ for (auto &pattern : items_has_rest.get_lower_patterns ())
786
+ {
787
+ tree binding
788
+ = Backend::struct_field_expression (match_scrutinee_expr,
789
+ tuple_field_index++,
790
+ pattern->get_locus ());
791
+
792
+ CompilePatternBindings::Compile (*pattern, binding, ctx);
793
+ }
794
+
795
+ tuple_field_index = variant->num_fields ()
796
+ - items_has_rest.get_upper_patterns ().size ();
797
+
798
+ for (auto &pattern : items_has_rest.get_upper_patterns ())
799
+ {
800
+ tree binding
801
+ = Backend::struct_field_expression (match_scrutinee_expr,
802
+ tuple_field_index++,
803
+ pattern->get_locus ());
804
+
805
+ CompilePatternBindings::Compile (*pattern, binding, ctx);
806
+ }
743
807
}
744
808
break ;
745
809
746
810
case HIR::TupleStructItems::NO_REST:
747
811
{
748
- HIR::TupleStructItemsNoRest &items_no_range
812
+ HIR::TupleStructItemsNoRest &items_no_rest
749
813
= static_cast <HIR::TupleStructItemsNoRest &> (items);
750
-
751
- rust_assert (items_no_range.get_patterns ().size ()
814
+ rust_assert (items_no_rest.get_patterns ().size ()
752
815
== variant->num_fields ());
753
816
754
817
if (adt->is_enum ())
755
818
{
756
819
size_t tuple_field_index = 0 ;
757
- for (auto &pattern : items_no_range .get_patterns ())
820
+ for (auto &pattern : items_no_rest .get_patterns ())
758
821
{
759
822
tree payload_accessor_union
760
823
= Backend::struct_field_expression (match_scrutinee_expr, 1 ,
@@ -776,12 +839,10 @@ CompilePatternBindings::visit (HIR::TupleStructPattern &pattern)
776
839
else
777
840
{
778
841
size_t tuple_field_index = 0 ;
779
- for (auto &pattern : items_no_range .get_patterns ())
842
+ for (auto &pattern : items_no_rest .get_patterns ())
780
843
{
781
- tree variant_accessor = match_scrutinee_expr;
782
-
783
844
tree binding
784
- = Backend::struct_field_expression (variant_accessor ,
845
+ = Backend::struct_field_expression (match_scrutinee_expr ,
785
846
tuple_field_index++,
786
847
pattern->get_locus ());
787
848
0 commit comments