]> git.lizzy.rs Git - rust.git/commitdiff
Give a more accurate error on thin-to-fat ptr cast
authorJonas Schievink <jonas@schievink.net>
Sun, 13 Mar 2016 16:01:10 +0000 (17:01 +0100)
committerJonas Schievink <jonas@schievink.net>
Sun, 13 Mar 2016 16:03:31 +0000 (17:03 +0100)
Fixes #31511

src/librustc_typeck/check/cast.rs
src/test/compile-fail/issue-31511.rs [new file with mode: 0644]

index b5cd5d7f8e5a38d391ab2f056ff70de16cc60d56..31c0fea5c2d97229bdb3f199edf4d51d7046a1f2 100644 (file)
@@ -100,6 +100,8 @@ enum CastError {
     CastToBool,
     CastToChar,
     DifferingKinds,
+    /// Cast of thin to fat raw ptr (eg. `*const () as *const [u8]`)
+    SizedUnsizedCast,
     IllegalCast,
     NeedViaPtr,
     NeedViaThinPtr,
@@ -165,6 +167,13 @@ fn report_cast_error<'a>(&self, fcx: &FnCtxt<'a, 'tcx>,
                             fcx.infcx().ty_to_string(self.cast_ty))
                 }, self.expr_ty, None);
             }
+            CastError::SizedUnsizedCast => {
+                fcx.type_error_message(self.span, |actual| {
+                    format!("cannot cast thin pointer `{}` to fat pointer `{}`",
+                            actual,
+                            fcx.infcx().ty_to_string(self.cast_ty))
+                }, self.expr_ty, None)
+            }
             CastError::DifferingKinds => {
                 fcx.type_error_struct(self.span, |actual| {
                     format!("casting `{}` as `{}` is invalid",
@@ -312,7 +321,7 @@ fn check_ptr_ptr_cast<'a>(&self,
 
         // sized -> unsized? report invalid cast (don't complain about vtable kinds)
         if fcx.type_is_known_to_be_sized(m_expr.ty, self.span) {
-            return Err(CastError::IllegalCast);
+            return Err(CastError::SizedUnsizedCast);
         }
 
         // vtable kinds must match
diff --git a/src/test/compile-fail/issue-31511.rs b/src/test/compile-fail/issue-31511.rs
new file mode 100644 (file)
index 0000000..dd1af2f
--- /dev/null
@@ -0,0 +1,16 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn cast_thin_to_fat(x: *const ()) {
+    x as *const [u8];
+    //~^ ERROR: cannot cast thin pointer `*const ()` to fat pointer `*const [u8]`
+}
+
+fn main() {}