https://gcc.gnu.org/g:732c9d0cd5d1ebfee57aa1f4ee5d1487765d5ca7

commit r15-9099-g732c9d0cd5d1ebfee57aa1f4ee5d1487765d5ca7
Author: Philip Herron <herron.phi...@googlemail.com>
Date:   Thu Mar 27 17:27:56 2025 +0000

    gccrs: Fix ICE during const expr eval on array expressions
    
    Array expressions are still getting turned into VIEW_CONVERT_EXPR's becuase
    TYPE_MAIN_VARIANT is not set so then we might as well reuse the type-hasher
    to sort this out.
    
    Fixes Rust-GCC#3588
    
    gcc/rust/ChangeLog:
    
            * backend/rust-compile-context.h: only push named types
            * backend/rust-compile-type.cc (TyTyResolveCompile::visit): run the 
type hasher
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/issue-3588.rs: New test.
    
    Signed-off-by: Philip Herron <herron.phi...@googlemail.com>

Diff:
---
 gcc/rust/backend/rust-compile-context.h  | 5 ++++-
 gcc/rust/backend/rust-compile-type.cc    | 2 ++
 gcc/testsuite/rust/compile/issue-3588.rs | 5 +++++
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/backend/rust-compile-context.h 
b/gcc/rust/backend/rust-compile-context.h
index a44638817dbc..ce81a1d0db2c 100644
--- a/gcc/rust/backend/rust-compile-context.h
+++ b/gcc/rust/backend/rust-compile-context.h
@@ -72,7 +72,10 @@ public:
       return it->second;
 
     compiled_type_map.insert ({h, type});
-    push_type (type);
+
+    if (TYPE_NAME (type) != NULL)
+      push_type (type);
+
     return type;
   }
 
diff --git a/gcc/rust/backend/rust-compile-type.cc 
b/gcc/rust/backend/rust-compile-type.cc
index 813e11c47cfe..83e5756429f5 100644
--- a/gcc/rust/backend/rust-compile-type.cc
+++ b/gcc/rust/backend/rust-compile-type.cc
@@ -481,6 +481,8 @@ TyTyResolveCompile::visit (const TyTy::ArrayType &type)
   tree folded_capacity_expr = fold_expr (capacity_expr);
 
   translated = Backend::array_type (element_type, folded_capacity_expr);
+  if (translated != error_mark_node)
+    translated = ctx->insert_compiled_type (translated);
 }
 
 void
diff --git a/gcc/testsuite/rust/compile/issue-3588.rs 
b/gcc/testsuite/rust/compile/issue-3588.rs
new file mode 100644
index 000000000000..744d9671c42a
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-3588.rs
@@ -0,0 +1,5 @@
+const FOO: i32 = if true { [1, 2, 3] } else { [2, 3, 4] }[0];
+
+pub fn test() -> i32 {
+    FOO
+}

Reply via email to