diff --git a/compiler/rustc_ast_passes/src/ast_validation.rs b/compiler/rustc_ast_passes/src/ast_validation.rs index ee46bdcf7d8bb..dc2a8be5b3cf1 100644 --- a/compiler/rustc_ast_passes/src/ast_validation.rs +++ b/compiler/rustc_ast_passes/src/ast_validation.rs @@ -1379,7 +1379,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> { this.dcx() .emit_err(errors::ScalableVectorNotTupleStruct { span: item.span }); } - if !self.sess.target.arch.supports_scalable_vectors() { + if !self.sess.target.arch.supports_scalable_vectors() + && !self.sess.opts.actually_rustdoc + { this.dcx().emit_err(errors::ScalableVectorBadArch { span: attr.span }); } } diff --git a/compiler/rustc_middle/src/ty/sty.rs b/compiler/rustc_middle/src/ty/sty.rs index 621ceeffac658..0e0715a8861bc 100644 --- a/compiler/rustc_middle/src/ty/sty.rs +++ b/compiler/rustc_middle/src/ty/sty.rs @@ -1640,6 +1640,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, } } @@ -1661,6 +1664,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, } } @@ -1679,6 +1685,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 @@ -1700,7 +1709,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`.