diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2025-01-15 22:06:11 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-15 22:06:11 +0100 |
| commit | 5bebace822b35d5519e9483f1b7e67aa6e44d3ea (patch) | |
| tree | 1f9432aee95316a0a735e9f04bb90de9b5ac8b54 | |
| parent | 85d2b2af150e6380425554f63e9d2fa2a9f1a761 (diff) | |
| parent | 67a07e01cf8db40d30cea7489d78413bb3b79b00 (diff) | |
| download | rust-5bebace822b35d5519e9483f1b7e67aa6e44d3ea.tar.gz rust-5bebace822b35d5519e9483f1b7e67aa6e44d3ea.zip | |
Rollup merge of #135522 - lqd:issue-135514, r=compiler-errors
add incremental test for issue 135514 r? `@compiler-errors` as requested in https://github.com/rust-lang/rust/issues/135514#issuecomment-2591614811 This adds parts of `@steffahn's` repro as an incremental test for #135514. I had initially added the actual exploitation of the issue into the safe transmute, but removed it because it's not exactly needed for such a test. I can add it back if you'd like. I've verified that the test fails with https://github.com/rust-lang/rust/pull/133828 reverted.
| -rw-r--r-- | tests/incremental/overlapping-impls-in-new-solver-issue-135514.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/incremental/overlapping-impls-in-new-solver-issue-135514.rs b/tests/incremental/overlapping-impls-in-new-solver-issue-135514.rs new file mode 100644 index 00000000000..8fcc913fa37 --- /dev/null +++ b/tests/incremental/overlapping-impls-in-new-solver-issue-135514.rs @@ -0,0 +1,40 @@ +// Regression test for #135514 where the new solver didn't properly record deps for incremental +// compilation, similarly to `track-deps-in-new-solver.rs`. +// +// In this specially crafted example, @steffahn was able to trigger unsoundness with an overlapping +// impl that was accepted during the incremental rebuild. + +//@ revisions: cpass1 cfail2 +//@ compile-flags: -Znext-solver + +pub trait Trait {} + +pub struct S0<T>(T); + +pub struct S<T>(T); +impl<T> Trait for S<T> where S0<T>: Trait {} + +pub struct W; + +pub trait Other { + type Choose<L, R>; +} + +// first impl +impl<T: Trait> Other for T { + type Choose<L, R> = L; +} + +// second impl +impl<T> Other for S<T> { + //[cfail2]~^ ERROR conflicting implementations of trait + type Choose<L, R> = R; +} + +#[cfg(cpass1)] +impl Trait for W {} + +#[cfg(cfail2)] +impl Trait for S<W> {} + +fn main() {} |
