about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2025-01-15 22:06:11 +0100
committerGitHub <noreply@github.com>2025-01-15 22:06:11 +0100
commit5bebace822b35d5519e9483f1b7e67aa6e44d3ea (patch)
tree1f9432aee95316a0a735e9f04bb90de9b5ac8b54
parent85d2b2af150e6380425554f63e9d2fa2a9f1a761 (diff)
parent67a07e01cf8db40d30cea7489d78413bb3b79b00 (diff)
downloadrust-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.rs40
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() {}