From: Philip Herron Date: Wed, 24 Jun 2026 14:25:58 +0000 (+0100) Subject: gccrs: Fix ICE when handling invalid results during monomprhization X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=261d52b66050eee163f4b022f910ad17f9aa407d;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/backend/rust-compile-item.cc b/gcc/rust/backend/rust-compile-item.cc index 4c627ac90bb..423df15c2ca 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 ()); + if (!resolved->is ()) + return; + fntype = resolved->as (); } 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 00000000000..29e30757fab --- /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(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 00000000000..d3232422e42 --- /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(n: T) -> Self; +} + +trait NumberExt: Number { + fn to_double(&self) -> f64 { + self.to_float() * 2.0 + } +} + +impl NumberExt for T {} + +impl Number for f64 { + fn from(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; +}