Forbid non-derefable types explicitly in unsizing casts
This commit is contained in:
parent
40857b9453
commit
cd7204ef39
@ -193,7 +193,15 @@ fn check_rvalue(
|
||||
_,
|
||||
) => Err((span, "function pointer casts are not allowed in const fn".into())),
|
||||
Rvalue::Cast(CastKind::Pointer(PointerCast::Unsize), op, cast_ty) => {
|
||||
let pointee_ty = cast_ty.builtin_deref(true).unwrap().ty;
|
||||
let pointee_ty = if let Some(deref_ty) = cast_ty.builtin_deref(true) {
|
||||
deref_ty.ty
|
||||
} else {
|
||||
// We cannot allow this for now.
|
||||
return Err((
|
||||
span,
|
||||
"unsizing casts are only allowed for references right now".into(),
|
||||
));
|
||||
};
|
||||
let unsized_ty = tcx.struct_tail_erasing_lifetimes(pointee_ty, tcx.param_env(def_id));
|
||||
if let ty::Slice(_) | ty::Str = unsized_ty.kind {
|
||||
check_operand(tcx, op, span, def_id, body)?;
|
||||
|
10
src/test/ui/consts/unsizing-cast-non-null.rs
Normal file
10
src/test/ui/consts/unsizing-cast-non-null.rs
Normal file
@ -0,0 +1,10 @@
|
||||
// Regression test for #75118.
|
||||
|
||||
use std::ptr::NonNull;
|
||||
|
||||
pub const fn dangling_slice<T>() -> NonNull<[T]> {
|
||||
NonNull::<[T; 0]>::dangling()
|
||||
//~^ ERROR: unsizing casts are only allowed for references right now
|
||||
}
|
||||
|
||||
fn main() {}
|
12
src/test/ui/consts/unsizing-cast-non-null.stderr
Normal file
12
src/test/ui/consts/unsizing-cast-non-null.stderr
Normal file
@ -0,0 +1,12 @@
|
||||
error[E0723]: unsizing casts are only allowed for references right now
|
||||
--> $DIR/unsizing-cast-non-null.rs:6:5
|
||||
|
|
||||
LL | NonNull::<[T; 0]>::dangling()
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0723`.
|
Loading…
Reference in New Issue
Block a user