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:
commit
0e710d0883
3 changed files with 46 additions and 0 deletions
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
|
|
|
|||
15
tests/ui/unsafe/move-out-of-non-copy.rs
Normal file
15
tests/ui/unsafe/move-out-of-non-copy.rs
Normal 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() {}
|
||||
14
tests/ui/unsafe/move-out-of-non-copy.stderr
Normal file
14
tests/ui/unsafe/move-out-of-non-copy.stderr
Normal 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`.
|
||||
Loading…
Add table
Add a link
Reference in a new issue