diff --git a/compiler/rustc_middle/src/ty/sty.rs b/compiler/rustc_middle/src/ty/sty.rs index 0d047b348d9e1..b6d4f6ca0d82e 100644 --- a/compiler/rustc_middle/src/ty/sty.rs +++ b/compiler/rustc_middle/src/ty/sty.rs @@ -1630,6 +1630,9 @@ impl<'tcx> Ty<'tcx> { 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, } } @@ -1651,6 +1654,9 @@ impl<'tcx> Ty<'tcx> { 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, } } @@ -1669,6 +1675,9 @@ impl<'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 @@ -1690,7 +1699,6 @@ impl<'tcx> Ty<'tcx> { | ty::CoroutineWitness(..) | ty::Never | ty::Tuple(_) - | ty::UnsafeBinder(_) | ty::Error(_) | ty::Infer(IntVar(_) | FloatVar(_)) => tcx.types.u8, diff --git a/tests/ui/unsafe-binders/discriminant-for-variant.rs b/tests/ui/unsafe-binders/discriminant-for-variant.rs new file mode 100644 index 0000000000000..6a2ef22e92628 --- /dev/null +++ b/tests/ui/unsafe-binders/discriminant-for-variant.rs @@ -0,0 +1,11 @@ +#![feature(unsafe_binders)] + +const None: Option Option>> = 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 { + _ => {} + } +} diff --git a/tests/ui/unsafe-binders/discriminant-for-variant.stderr b/tests/ui/unsafe-binders/discriminant-for-variant.stderr new file mode 100644 index 0000000000000..ed1a38ae14e40 --- /dev/null +++ b/tests/ui/unsafe-binders/discriminant-for-variant.stderr @@ -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 Option>> = None; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `Box<(dyn Send + 'static)>` + | + = note: required for `Option>` 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 Option>> = None; + | ^^^^ the trait `Copy` is not implemented for `Box<(dyn Send + 'static)>` + | + = note: required for `Option>` to implement `Copy` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0277`.