]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Fix ICE for reference patterns in match statements
authorDave Evans <dave@dmetwo.org>
Fri, 9 Jun 2023 00:18:42 +0000 (19:18 -0500)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:46:27 +0000 (18:46 +0100)
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>
gcc/rust/backend/rust-compile-expr.cc
gcc/testsuite/rust/compile/issue-1813.rs [new file with mode: 0644]

index 5152c99362f13d155c28f3bd406b2ebeb57edcea..9daad0ad7f3456f68bef48a776bcbb75363b96a8 100644 (file)
@@ -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 (file)
index 0000000..6d35d45
--- /dev/null
@@ -0,0 +1,9 @@
+fn main() {
+    let a = 15u8;
+    let a = &a;
+    match a {
+        &15 => {}
+        &14 => {}
+        _ => {}
+    }
+}