]> git.lizzy.rs Git - rust.git/commitdiff
Auto merge of #32232 - jonas-schievink:issue31511, r=eddyb
authorbors <bors@rust-lang.org>
Mon, 14 Mar 2016 12:44:24 +0000 (05:44 -0700)
committerbors <bors@rust-lang.org>
Mon, 14 Mar 2016 12:44:24 +0000 (05:44 -0700)
Give a more accurate error on thin-to-fat ptr cast

Fixes #31511

src/librustc_typeck/check/cast.rs
src/test/compile-fail/cast-rfc0401.rs
src/test/compile-fail/fat-ptr-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
index d14b0fa9e6602a397e3a715961b44370909aa0df..8e129722722aaa3be723d8a9cdb014a70c14e78b 100644 (file)
@@ -87,7 +87,7 @@ fn main()
     //~^^ HELP through a usize first
 
     let _ = 42usize as *const [u8]; //~ ERROR casting
-    let _ = v as *const [u8]; //~ ERROR casting
+    let _ = v as *const [u8]; //~ ERROR cannot cast
     let _ = fat_v as *const Foo;
     //~^ ERROR `core::marker::Sized` is not implemented for the type `[u8]`
     let _ = foo as *const str; //~ ERROR casting
index 1c462779b433c707541e1bd19d0fafef17fb3f99..c920b6c171e3267be059344350416739d44b0141 100644 (file)
@@ -24,7 +24,7 @@ fn main() {
     //~^^ HELP cast through a thin pointer
 
     // #22955
-    q as *const [i32]; //~ ERROR casting
+    q as *const [i32]; //~ ERROR cannot cast
 
     // #21397
     let t: *mut (Trait + 'static) = 0 as *mut _; //~ ERROR casting
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() {}