about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVeera <sveera.2001@gmail.com>2023-12-20 20:35:53 -0500
committerVeera <sveera.2001@gmail.com>2023-12-20 20:50:32 -0500
commite6e195e27e6d5d12a135e4a40472c253bd63a77f (patch)
treead07e145b6f6236c447c099527726e738eacd39e
parent5ac4c8a63ee305742071ac6dd11817f7c24adce2 (diff)
downloadrust-e6e195e27e6d5d12a135e4a40472c253bd63a77f.tar.gz
rust-e6e195e27e6d5d12a135e4a40472c253bd63a77f.zip
fix: diagnostic for casting reference to slice
fixes: #118790
-rw-r--r--compiler/rustc_hir_typeck/src/cast.rs30
-rw-r--r--tests/ui/cast/cast-to-slice.rs8
-rw-r--r--tests/ui/cast/cast-to-slice.stderr19
3 files changed, 39 insertions, 18 deletions
diff --git a/compiler/rustc_hir_typeck/src/cast.rs b/compiler/rustc_hir_typeck/src/cast.rs
index 0de0365364c..a6c22a536d7 100644
--- a/compiler/rustc_hir_typeck/src/cast.rs
+++ b/compiler/rustc_hir_typeck/src/cast.rs
@@ -576,25 +576,19 @@ impl<'a, 'tcx> CastCheck<'tcx> {
         match self.expr_ty.kind() {
             ty::Ref(_, _, mt) => {
                 let mtstr = mt.prefix_str();
-                if self.cast_ty.is_trait() {
-                    match fcx.tcx.sess.source_map().span_to_snippet(self.cast_span) {
-                        Ok(s) => {
-                            err.span_suggestion(
-                                self.cast_span,
-                                "try casting to a reference instead",
-                                format!("&{mtstr}{s}"),
-                                Applicability::MachineApplicable,
-                            );
-                        }
-                        Err(_) => {
-                            let msg = format!("did you mean `&{mtstr}{tstr}`?");
-                            err.span_help(self.cast_span, msg);
-                        }
+                match fcx.tcx.sess.source_map().span_to_snippet(self.cast_span) {
+                    Ok(s) => {
+                        err.span_suggestion(
+                            self.cast_span,
+                            "try casting to a reference instead",
+                            format!("&{mtstr}{s}"),
+                            Applicability::MachineApplicable,
+                        );
+                    }
+                    Err(_) => {
+                        let msg = format!("did you mean `&{mtstr}{tstr}`?");
+                        err.span_help(self.cast_span, msg);
                     }
-                } else {
-                    let msg =
-                        format!("consider using an implicit coercion to `&{mtstr}{tstr}` instead");
-                    err.span_help(self.span, msg);
                 }
             }
             ty::Adt(def, ..) if def.is_box() => {
diff --git a/tests/ui/cast/cast-to-slice.rs b/tests/ui/cast/cast-to-slice.rs
new file mode 100644
index 00000000000..a6c784a3d47
--- /dev/null
+++ b/tests/ui/cast/cast-to-slice.rs
@@ -0,0 +1,8 @@
+fn main() {
+    "example".as_bytes() as [char];
+    //~^ ERROR cast to unsized type
+
+    let arr: &[u8] = &[0, 2, 3];
+    arr as [char];
+    //~^ ERROR cast to unsized type
+}
diff --git a/tests/ui/cast/cast-to-slice.stderr b/tests/ui/cast/cast-to-slice.stderr
new file mode 100644
index 00000000000..340c9c48859
--- /dev/null
+++ b/tests/ui/cast/cast-to-slice.stderr
@@ -0,0 +1,19 @@
+error[E0620]: cast to unsized type: `&[u8]` as `[char]`
+  --> $DIR/cast-to-slice.rs:2:5
+   |
+LL |     "example".as_bytes() as [char]; 
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^------
+   |                             |
+   |                             help: try casting to a reference instead: `&[char]`
+
+error[E0620]: cast to unsized type: `&[u8]` as `[char]`
+  --> $DIR/cast-to-slice.rs:6:5
+   |
+LL |     arr as [char];
+   |     ^^^^^^^------
+   |            |
+   |            help: try casting to a reference instead: `&[char]`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0620`.