Skip to content

Commit 5aa619f

Browse files
committed
gccrs: Fix TupleStructPattern compilation throwing error
Code for TupleStructPattern compilation previously only assumes that it is derived from an enum. This commit adds a check for that, and compiles non-enum TupleStructPatterns similarly to TuplePatterns if it is not an enum. gcc/rust/ChangeLog: * backend/rust-compile-pattern.cc(CompilePatternCheckExpr::visit(TupleStructPattern)): Fix error thrown when compiling non-enum TupleStructPattern. Signed-off-by: Yap Zhi Heng <yapzhhg@gmail.com>
1 parent 3b4d11c commit 5aa619f

3 files changed

Lines changed: 64 additions & 19 deletions

File tree

gcc/rust/backend/rust-compile-pattern.cc

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -369,31 +369,55 @@ CompilePatternCheckExpr::visit (HIR::TupleStructPattern &pattern)
369369
rust_assert (items_no_range.get_patterns ().size ()
370370
== variant->num_fields ());
371371

372-
size_t tuple_field_index = 0;
373-
for (auto &pattern : items_no_range.get_patterns ())
372+
if (adt->is_enum ())
374373
{
375-
// find payload union field of scrutinee
376-
tree payload_ref
377-
= Backend::struct_field_expression (match_scrutinee_expr, 1,
378-
pattern->get_locus ());
374+
size_t tuple_field_index = 0;
375+
for (auto &pattern : items_no_range.get_patterns ())
376+
{
377+
// find payload union field of scrutinee
378+
tree payload_ref
379+
= Backend::struct_field_expression (match_scrutinee_expr, 1,
380+
pattern->get_locus ());
379381

380-
tree variant_ref
381-
= Backend::struct_field_expression (payload_ref, variant_index,
382-
pattern->get_locus ());
382+
tree variant_ref
383+
= Backend::struct_field_expression (payload_ref,
384+
variant_index,
385+
pattern->get_locus ());
383386

384-
tree field_expr
385-
= Backend::struct_field_expression (variant_ref,
386-
tuple_field_index++,
387-
pattern->get_locus ());
387+
tree field_expr
388+
= Backend::struct_field_expression (variant_ref,
389+
tuple_field_index++,
390+
pattern->get_locus ());
388391

389-
tree check_expr_sub
390-
= CompilePatternCheckExpr::Compile (*pattern, field_expr, ctx);
391-
check_expr = Backend::arithmetic_or_logical_expression (
392-
ArithmeticOrLogicalOperator::BITWISE_AND, check_expr,
393-
check_expr_sub, pattern->get_locus ());
392+
tree check_expr_sub
393+
= CompilePatternCheckExpr::Compile (*pattern, field_expr,
394+
ctx);
395+
check_expr = Backend::arithmetic_or_logical_expression (
396+
ArithmeticOrLogicalOperator::BITWISE_AND, check_expr,
397+
check_expr_sub, pattern->get_locus ());
398+
}
399+
}
400+
else
401+
{
402+
// For non-enum TupleStructPatterns
403+
size_t tuple_field_index = 0;
404+
for (auto &pattern : items_no_range.get_patterns ())
405+
{
406+
tree field_expr
407+
= Backend::struct_field_expression (match_scrutinee_expr,
408+
tuple_field_index++,
409+
pattern->get_locus ());
410+
411+
tree check_expr_sub
412+
= CompilePatternCheckExpr::Compile (*pattern, field_expr,
413+
ctx);
414+
check_expr = Backend::arithmetic_or_logical_expression (
415+
ArithmeticOrLogicalOperator::BITWISE_AND, check_expr,
416+
check_expr_sub, pattern->get_locus ());
417+
}
394418
}
419+
break;
395420
}
396-
break;
397421
}
398422
}
399423

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
fn main() {
2+
struct A (i32, i32);
3+
let a = A (0, 1);
4+
5+
match a {
6+
A (0, 1) => {},
7+
_ => {}
8+
}
9+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
fn main() -> i32 {
2+
struct A (i32, i32);
3+
let a = A (0, 1);
4+
let mut ret = 1;
5+
6+
match a {
7+
A (0, b) => { ret -= b },
8+
_ => {}
9+
}
10+
11+
ret
12+
}

0 commit comments

Comments
 (0)