Rollup merge of #141431 - compiler-errors:open-drop, r=oli-obk

Emit dummy open drop for unsafe binder

Fixes rust-lang/rust#141394

We can't taint the body in wfcheck when we have a `T: Copy` bound failure, so we end up binding MIR here. Emit a dummy open drop so that drop elaboration doesn't fail.

r? oli-obk
This commit is contained in:
许杰友 Jieyou Xu (Joe) 2025-05-27 01:29:18 +08:00 committed by GitHub
commit 0e710d0883
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 46 additions and 0 deletions

View file

@ -1278,6 +1278,23 @@ where
}
ty::Slice(ety) => self.drop_loop_trio_for_slice(*ety),
ty::UnsafeBinder(_) => {
// Unsafe binders may elaborate drops if their inner type isn't copy.
// This is enforced in typeck, so this should never happen.
self.tcx().dcx().span_delayed_bug(
self.source_info.span,
"open drop for unsafe binder shouldn't be encountered",
);
self.elaborator.patch().new_block(BasicBlockData {
statements: vec![],
terminator: Some(Terminator {
source_info: self.source_info,
kind: TerminatorKind::Unreachable,
}),
is_cleanup: self.unwind.is_cleanup(),
})
}
_ => span_bug!(self.source_info.span, "open drop from non-ADT `{:?}`", ty),
}
}

View file

@ -0,0 +1,15 @@
//@ compile-flags: -Zvalidate-mir
// Regression test for <https://github.com/rust-lang/rust/issues/141394>.
#![feature(unsafe_binders)]
#![allow(incomplete_features)]
use std::unsafe_binder::unwrap_binder;
fn id<T>(x: unsafe<> T) -> T {
//~^ ERROR the trait bound `T: Copy` is not satisfied
unsafe { unwrap_binder!(x) }
}
fn main() {}

View file

@ -0,0 +1,14 @@
error[E0277]: the trait bound `T: Copy` is not satisfied
--> $DIR/move-out-of-non-copy.rs:10:13
|
LL | fn id<T>(x: unsafe<> T) -> T {
| ^^^^^^^^^^ the trait `Copy` is not implemented for `T`
|
help: consider restricting type parameter `T` with trait `Copy`
|
LL | fn id<T: std::marker::Copy>(x: unsafe<> T) -> T {
| +++++++++++++++++++
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0277`.