mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-28 19:27:30 +03:00
Rollup merge of #154717 - cijiugechu:fix/unsafe-binder-discriminant, r=jdonszelmann
Fix ICE in unsafe binder discriminant helpers Forward discriminant-related helpers through `ty::UnsafeBinder` to the erased inner type, matching the existing layout behavior. Tracking issue: rust-lang/rust#130516 Closes rust-lang/rust#154424
This commit is contained in:
@@ -1640,6 +1640,9 @@ pub fn variant_range(self, tcx: TyCtxt<'tcx>) -> Option<Range<VariantIdx>> {
|
||||
TyKind::Coroutine(def_id, args) => {
|
||||
Some(args.as_coroutine().variant_range(*def_id, tcx))
|
||||
}
|
||||
TyKind::UnsafeBinder(bound_ty) => {
|
||||
tcx.instantiate_bound_regions_with_erased((*bound_ty).into()).variant_range(tcx)
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
@@ -1661,6 +1664,9 @@ pub fn discriminant_for_variant(
|
||||
TyKind::Coroutine(def_id, args) => {
|
||||
Some(args.as_coroutine().discriminant_for_variant(*def_id, tcx, variant_index))
|
||||
}
|
||||
TyKind::UnsafeBinder(bound_ty) => tcx
|
||||
.instantiate_bound_regions_with_erased((*bound_ty).into())
|
||||
.discriminant_for_variant(tcx, variant_index),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
@@ -1679,6 +1685,9 @@ pub fn discriminant_ty(self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> {
|
||||
}
|
||||
|
||||
ty::Pat(ty, _) => ty.discriminant_ty(tcx),
|
||||
ty::UnsafeBinder(bound_ty) => {
|
||||
tcx.instantiate_bound_regions_with_erased((*bound_ty).into()).discriminant_ty(tcx)
|
||||
}
|
||||
|
||||
ty::Bool
|
||||
| ty::Char
|
||||
@@ -1700,7 +1709,6 @@ pub fn discriminant_ty(self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> {
|
||||
| ty::CoroutineWitness(..)
|
||||
| ty::Never
|
||||
| ty::Tuple(_)
|
||||
| ty::UnsafeBinder(_)
|
||||
| ty::Error(_)
|
||||
| ty::Infer(IntVar(_) | FloatVar(_)) => tcx.types.u8,
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
#![feature(unsafe_binders)]
|
||||
|
||||
const None: Option<unsafe<> Option<Box<dyn Send>>> = None;
|
||||
//~^ ERROR the trait bound `Box<(dyn Send + 'static)>: Copy` is not satisfied
|
||||
//~| ERROR the trait bound `Box<(dyn Send + 'static)>: Copy` is not satisfied
|
||||
|
||||
fn main() {
|
||||
match None {
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
error[E0277]: the trait bound `Box<(dyn Send + 'static)>: Copy` is not satisfied
|
||||
--> $DIR/discriminant-for-variant.rs:3:13
|
||||
|
|
||||
LL | const None: Option<unsafe<> Option<Box<dyn Send>>> = None;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `Box<(dyn Send + 'static)>`
|
||||
|
|
||||
= note: required for `Option<Box<(dyn Send + 'static)>>` to implement `Copy`
|
||||
|
||||
error[E0277]: the trait bound `Box<(dyn Send + 'static)>: Copy` is not satisfied
|
||||
--> $DIR/discriminant-for-variant.rs:3:54
|
||||
|
|
||||
LL | const None: Option<unsafe<> Option<Box<dyn Send>>> = None;
|
||||
| ^^^^ the trait `Copy` is not implemented for `Box<(dyn Send + 'static)>`
|
||||
|
|
||||
= note: required for `Option<Box<(dyn Send + 'static)>>` to implement `Copy`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
Reference in New Issue
Block a user