diff options
author | Dave Evans <dave@dmetwo.org> | 2023-06-08 19:18:42 -0500 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2023-06-13 08:16:21 +0000 |
commit | e3e945f055f2d2dd972e20380c2df69a62912be7 (patch) | |
tree | f80a19cb9c2825edb90124d2aceb44eeabc0d8f6 | |
parent | 533e1ef3ca481b03b68b3e7c6bcc7ce0d14131bb (diff) | |
download | gcc-e3e945f055f2d2dd972e20380c2df69a62912be7.zip gcc-e3e945f055f2d2dd972e20380c2df69a62912be7.tar.gz gcc-e3e945f055f2d2dd972e20380c2df69a62912be7.tar.bz2 |
Fix ICE for reference patterns in match statements
gcc/rust/ChangeLog:
* backend/rust-compile-expr.cc (check_match_scrutinee): Add REF type to rust_assert.
(CompileExpr::visit): Add REF type for scrutinee_kind in MatchExpr visitor.
gcc/testsuite/ChangeLog:
* rust/compile/issue-1813.rs: New test.
Signed-off-by: Dave Evans <dave@dmetwo.org>
-rw-r--r-- | gcc/rust/backend/rust-compile-expr.cc | 9 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/issue-1813.rs | 9 |
2 files changed, 17 insertions, 1 deletions
diff --git a/gcc/rust/backend/rust-compile-expr.cc b/gcc/rust/backend/rust-compile-expr.cc index c907acb..7b8182f 100644 --- a/gcc/rust/backend/rust-compile-expr.cc +++ b/gcc/rust/backend/rust-compile-expr.cc @@ -1274,7 +1274,8 @@ check_match_scrutinee (HIR::MatchExpr &expr, Context *ctx) rust_assert ((TyTy::is_primitive_type_kind (scrutinee_kind) && scrutinee_kind != TyTy::TypeKind::NEVER) || scrutinee_kind == TyTy::TypeKind::ADT - || scrutinee_kind == TyTy::TypeKind::TUPLE); + || scrutinee_kind == TyTy::TypeKind::TUPLE + || scrutinee_kind == TyTy::TypeKind::REF); if (scrutinee_kind == TyTy::TypeKind::ADT) { @@ -1362,6 +1363,12 @@ CompileExpr::visit (HIR::MatchExpr &expr) scrutinee_first_record_expr, 0, expr.get_scrutinee_expr ()->get_locus ()); } + else if (scrutinee_kind == TyTy::TypeKind::REF) + { + tree indirect + = indirect_expression (match_scrutinee_expr, expr.get_locus ()); + match_scrutinee_expr_qualifier_expr = indirect; + } else if (scrutinee_kind == TyTy::TypeKind::TUPLE) { // match on tuple becomes a series of nested switches, with one level diff --git a/gcc/testsuite/rust/compile/issue-1813.rs b/gcc/testsuite/rust/compile/issue-1813.rs new file mode 100644 index 0000000..6d35d45 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-1813.rs @@ -0,0 +1,9 @@ +fn main() { + let a = 15u8; + let a = &a; + match a { + &15 => {} + &14 => {} + _ => {} + } +} |