about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-08-04 17:46:10 +0900
committerYuki Okushi <huyuumi.dev@gmail.com>2020-08-04 17:46:10 +0900
commitcd7204ef394d1e53bb967086186e9b8664d7e268 (patch)
tree001388e814102929367d665d6784939d836d5729 /src
parent40857b9453a80801fc51b606b0d7532efedad42b (diff)
downloadrust-cd7204ef394d1e53bb967086186e9b8664d7e268.tar.gz
rust-cd7204ef394d1e53bb967086186e9b8664d7e268.zip
Forbid non-derefable types explicitly in unsizing casts
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/transform/qualify_min_const_fn.rs10
-rw-r--r--src/test/ui/consts/unsizing-cast-non-null.rs10
-rw-r--r--src/test/ui/consts/unsizing-cast-non-null.stderr12
3 files changed, 31 insertions, 1 deletions
diff --git a/src/librustc_mir/transform/qualify_min_const_fn.rs b/src/librustc_mir/transform/qualify_min_const_fn.rs
index de7d7f27186..34fa840408f 100644
--- a/src/librustc_mir/transform/qualify_min_const_fn.rs
+++ b/src/librustc_mir/transform/qualify_min_const_fn.rs
@@ -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)?;
diff --git a/src/test/ui/consts/unsizing-cast-non-null.rs b/src/test/ui/consts/unsizing-cast-non-null.rs
new file mode 100644
index 00000000000..67d9f6baca5
--- /dev/null
+++ b/src/test/ui/consts/unsizing-cast-non-null.rs
@@ -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() {}
diff --git a/src/test/ui/consts/unsizing-cast-non-null.stderr b/src/test/ui/consts/unsizing-cast-non-null.stderr
new file mode 100644
index 00000000000..6575355daad
--- /dev/null
+++ b/src/test/ui/consts/unsizing-cast-non-null.stderr
@@ -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`.