aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Evans <dave@dmetwo.org>2023-06-08 19:18:42 -0500
committerPhilip Herron <philip.herron@embecosm.com>2023-06-13 08:16:21 +0000
commite3e945f055f2d2dd972e20380c2df69a62912be7 (patch)
treef80a19cb9c2825edb90124d2aceb44eeabc0d8f6
parent533e1ef3ca481b03b68b3e7c6bcc7ce0d14131bb (diff)
downloadgcc-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.cc9
-rw-r--r--gcc/testsuite/rust/compile/issue-1813.rs9
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 => {}
+ _ => {}
+ }
+}