From ef367ed3259948e3d738c7205a8dbe09a150fef6 Mon Sep 17 00:00:00 2001 From: lapla Date: Mon, 6 Apr 2026 23:00:20 +0900 Subject: [PATCH] transmutability: Stall new solver when inference variables remain --- .../src/solve/eval_ctxt/mod.rs | 3 +++ .../transmutability-coherence.rs | 10 ++++++++++ .../transmutability-coherence.stderr | 19 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 tests/ui/transmutability/transmutability-coherence.rs create mode 100644 tests/ui/transmutability/transmutability-coherence.stderr diff --git a/compiler/rustc_next_trait_solver/src/solve/eval_ctxt/mod.rs b/compiler/rustc_next_trait_solver/src/solve/eval_ctxt/mod.rs index 6841fe1c5124e..36cee1ac01b6a 100644 --- a/compiler/rustc_next_trait_solver/src/solve/eval_ctxt/mod.rs +++ b/compiler/rustc_next_trait_solver/src/solve/eval_ctxt/mod.rs @@ -1174,6 +1174,9 @@ where dst: I::Ty, assume: I::Const, ) -> Result { + if src.has_non_region_infer() || dst.has_non_region_infer() { + return Ok(Certainty::AMBIGUOUS); + } self.delegate.is_transmutable(dst, src, assume) } diff --git a/tests/ui/transmutability/transmutability-coherence.rs b/tests/ui/transmutability/transmutability-coherence.rs new file mode 100644 index 0000000000000..be3a9c0cb64c8 --- /dev/null +++ b/tests/ui/transmutability/transmutability-coherence.rs @@ -0,0 +1,10 @@ +#![feature(transmutability)] +trait OpaqueTrait {} + +impl> OpaqueTrait for T {} +//~^ ERROR: type provided when a constant was expected + +impl OpaqueTrait for &T where T: OpaqueTrait {} +//~^ ERROR: conflicting implementations of trait `OpaqueTrait` for type `&_` + +fn main() {} diff --git a/tests/ui/transmutability/transmutability-coherence.stderr b/tests/ui/transmutability/transmutability-coherence.stderr new file mode 100644 index 0000000000000..3d8af36432608 --- /dev/null +++ b/tests/ui/transmutability/transmutability-coherence.stderr @@ -0,0 +1,19 @@ +error[E0747]: type provided when a constant was expected + --> $DIR/transmutability-coherence.rs:4:37 + | +LL | impl> OpaqueTrait for T {} + | ^^ + +error[E0119]: conflicting implementations of trait `OpaqueTrait` for type `&_` + --> $DIR/transmutability-coherence.rs:7:1 + | +LL | impl> OpaqueTrait for T {} + | ---------------------------------------------------------- first implementation here +... +LL | impl OpaqueTrait for &T where T: OpaqueTrait {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `&_` + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0119, E0747. +For more information about an error, try `rustc --explain E0119`.