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:
Jonathan Brouwer
2026-04-06 08:27:51 +02:00
committed by GitHub
3 changed files with 39 additions and 1 deletions
+9 -1
View File
@@ -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`.