Closed
Description
I tried this code:
trait Mirror {
type Assoc: ?Sized;
}
impl<T: ?Sized> Mirror for T {
type Assoc = T;
}
trait Q: 'static {
fn q(&self);
}
impl Q for i32 {
fn q(&self) { println!("i32"); }
}
impl Q for <dyn Q as Mirror>::Assoc where Self: 'static {
fn q(&self) { println!("dyn Q"); }
}
fn foo<T: Q + ?Sized>(t: &T) {
t.q();
}
fn main() {
foo(&1 as &dyn Q);
}
I expected it to work. But instead:
Exited with signal 11 (SIGSEGV): segmentation violation
This is a manifestation of two bugs:
- Overlap between built-in and user-written impls for
dyn Trait: Trait
- Ambiguity was being treated as a hard error in the
impossible_predicates
method
Since the new trait solver treats some dyn Trait: Trait
overlap as ambiguity (specifically when the responses from the two candidates differ), and we strike methods from the vtable if impossible_predicates
returns true, a false positive will lead to a segfault.
Meta
rustc --version --verbose
:
rustc 1.89.0-nightly (16d2276fa 2025-05-16)
binary: rustc
commit-hash: 16d2276fa6fccb0cc239a542d4c3f0eb46f660ec
commit-date: 2025-05-16
host: x86_64-unknown-linux-gnu
release: 1.89.0-nightly
LLVM version: 20.1.4
Metadata
Metadata
Assignees
Labels
Area: Code generationCategory: This is a bug.Issue: A soundness hole (worst kind of bug), see: https://en.wikipedia.org/wiki/SoundnessCritical priorityRelevant to the compiler team, which will review and decide on the PR/issue.Relevant to the types team, which will review and decide on the PR/issue.The Rustc Trait System Refactor Initiative (-Znext-solver)