[gcc r17-2228] gccrs: Fix ICE when handling invalid results during monomprhization

Arthur Cohen via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:261d52b66050eee163f4b022f910ad17f9aa407d

commit r17-2228-g261d52b66050eee163f4b022f910ad17f9aa407d
Author: Philip Herron <[email protected]>
Date:   Wed Jun 24 15:25:58 2026 +0100

    gccrs: Fix ICE when handling invalid results during monomprhization
    
    Fixes Rust-GCC#4486
    
    gcc/rust/ChangeLog:
    
            * backend/rust-compile-item.cc (CompileItem::visit): check instead of assert
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/issue-4486-1.rs: New test.
            * rust/compile/issue-4486-2.rs: New test.
    
    Signed-off-by: Philip Herron <[email protected]>

Diff:
---
 gcc/rust/backend/rust-compile-item.cc      |  4 ++-
 gcc/testsuite/rust/compile/issue-4486-1.rs | 15 +++++++++++
 gcc/testsuite/rust/compile/issue-4486-2.rs | 41 ++++++++++++++++++++++++++++++
 3 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/backend/rust-compile-item.cc b/gcc/rust/backend/rust-compile-item.cc
index 4c627ac90bbe..423df15c2cac 100644
--- a/gcc/rust/backend/rust-compile-item.cc
+++ b/gcc/rust/backend/rust-compile-item.cc
@@ -180,7 +180,9 @@ CompileItem::visit (HIR::Function &function)
 				    TyTy::TyWithLocation (concrete),
 				    function.get_locus ());
 
-	  rust_assert (resolved->is<TyTy::FnType> ());
+	  if (!resolved->is<TyTy::FnType> ())
+	    return;
+
 	  fntype = resolved->as<TyTy::FnType> ();
 	}
 
diff --git a/gcc/testsuite/rust/compile/issue-4486-1.rs b/gcc/testsuite/rust/compile/issue-4486-1.rs
new file mode 100644
index 000000000000..29e30757fab7
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4486-1.rs
@@ -0,0 +1,15 @@
+#![feature(no_core, intrinsics, staged_api, lang_items)]
+#![no_core]
+
+#[lang = "sized"]
+pub trait Sized {}
+
+trait Number {
+    fn from<T>(n: T) -> Self;
+}
+
+trait NumConv {}
+
+fn main() {
+    let _: f64 = Number::from(0.0f64); // { dg-error {bounds not satisfied for f64 .Number. is not satisfied \[E0277\]} }
+}
diff --git a/gcc/testsuite/rust/compile/issue-4486-2.rs b/gcc/testsuite/rust/compile/issue-4486-2.rs
new file mode 100644
index 000000000000..d3232422e421
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4486-2.rs
@@ -0,0 +1,41 @@
+#![feature(no_core, intrinsics, staged_api, lang_items)]
+#![no_core]
+
+#[lang = "sized"]
+pub trait Sized {}
+
+pub trait Number: NumConv {
+    fn from<T: Number>(n: T) -> Self;
+}
+
+trait NumberExt: Number {
+    fn to_double(&self) -> f64 {
+        self.to_float() * 2.0
+    }
+}
+
+impl<T: Number> NumberExt for T {}
+
+impl Number for f64 {
+    fn from<T: Number + NewTrait>(n: T) -> f64 { // { dg-error {bounds not satisfied for f64 .NewTrait. is not satisfied \[E0277\]} }
+        n.to_float()
+    }
+}
+
+pub trait NumConv {
+    fn to_float(&self) -> f64;
+}
+
+impl NumConv for f64 {
+    fn to_float(&self) -> f64 {
+        *self
+    }
+}
+
+pub fn main() {
+    let _: f64 = Number::from(0.0f64);
+}
+
+trait NewTrait {
+    type Assoc;
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.