Change:
When working on PR , I ended up with the following output: The second span label points at the first character of the span, but because there's already a larger span there, the actual extent of that span is lost. I believe that either the shortest span should be shown within the existing span: there should be a new character introduced for when multiple labels overlap: or at the very least, colorize the smaller span with the secondary label's color:
Will be fixed when PR gets merged.

Discussion:
fn report_cast_error(&self, fcx: &FnCtxt<'a, 'gcx, 'tcx>, e: CastError) { match e { CastError::NeedDeref => { <ins> let error_span = self.span; </ins> let cast_ty = fcx.ty_to_string(self.cast_ty); <del> let mut err = fcx.type_error_struct(self.cast_span, </del> <ins> let mut err = fcx.type_error_struct(error_span, </ins> |actual| { format!("casting `{}` as `{}` is invalid", actual, cast_ty) }, self.expr_ty); <del> err.span_label(self.expr.span, </del> <ins> err.span_label(error_span, </ins> &format!("cannot cast `{}` as `{}`", fcx.ty_to_string(self.expr_ty), cast_ty)); if let Ok(snippet) = fcx.sess().codemap().span_to_snippet(self.expr.span) { <del> err.span_label(self.expr.span, </del> <ins> err.span_help(self.expr.span, </ins> &format!("did you mean `*{}`?", snippet)); } err.emit();

<del> // Copyright 2015 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 illegal_cast<U:?Sized,V:?Sized>(u: *const U) -> *const V { u as *const V //~^ ERROR casting //~^^ NOTE vtable kinds } fn illegal_cast_2<U:?Sized>(u: *const U) -> *const str { u as *const str //~^ ERROR casting //~^^ NOTE vtable kinds } trait Foo { fn foo(&self) {} } impl<T> Foo for T {} trait Bar { fn foo(&self) {} } impl<T> Bar for T {} enum E { A, B } fn main() { let f: f32 = 1.2; let v = 0 as *const u8; let fat_v : *const [u8] = unsafe { &*(0 as *const [u8; 1])}; let fat_sv : *const [i8] = unsafe { &*(0 as *const [i8; 1])}; let foo: &Foo = &f; let _ = v as &u8; //~ ERROR non-scalar let _ = v as E; //~ ERROR non-scalar let _ = v as fn(); //~ ERROR non-scalar let _ = v as (u32,); //~ ERROR non-scalar let _ = Some(&v) as *const u8; //~ ERROR non-scalar let _ = v as f32; //~^ ERROR casting let _ = main as f64; //~^ ERROR casting let _ = &v as usize; //~^ ERROR casting //~^^ HELP through a raw pointer first let _ = f as *const u8; //~^ ERROR casting let _ = 3_i32 as bool; //~^ ERROR cannot cast as `bool` [E0054] //~| unsupported cast //~| HELP compare with zero let _ = E::A as bool; //~^ ERROR cannot cast as `bool` [E0054] //~| unsupported cast //~| HELP compare with zero let _ = 0x61u32 as char; //~ ERROR only `u8` can be cast let _ = false as f32; //~^ ERROR casting //~^^ HELP through an integer first let _ = E::A as f32; //~^ ERROR casting //~^^ HELP through an integer first let _ = 'a' as f32; //~^ ERROR casting //~^^ HELP through an integer first let _ = false as *const u8; //~^ ERROR casting let _ = E::A as *const u8; //~^ ERROR casting let _ = 'a' as *const u8; //~^ ERROR casting let _ = 42usize as *const [u8]; //~ ERROR casting let _ = v as *const [u8]; //~ ERROR cannot cast let _ = fat_v as *const Foo; //~^ ERROR the trait bound `[u8]: std::marker::Sized` is not satisfied //~| NOTE the trait `std::marker::Sized` is not implemented for `[u8]` //~| NOTE `[u8]` does not have a constant size known at compile-time //~| NOTE required for the cast to the object type `Foo` let _ = foo as *const str; //~ ERROR casting let _ = foo as *mut str; //~ ERROR casting let _ = main as *mut str; //~ ERROR casting let _ = &f as *mut f32; //~ ERROR casting let _ = &f as *const f64; //~ ERROR casting let _ = fat_sv as usize; //~^ ERROR casting //~^^ HELP through a thin pointer first let a : *const str = "hello"; let _ = a as *const Foo; //~^ ERROR the trait bound `str: std::marker::Sized` is not satisfied //~| NOTE the trait `std::marker::Sized` is not implemented for `str` //~| NOTE `str` does not have a constant size known at compile-time //~| NOTE required for the cast to the object type `Foo` // check no error cascade let _ = main.f as *const u32; //~ no field `f` on type `fn() {main}` let cf: *const Foo = &0; let _ = cf as *const [u16]; //~^ ERROR casting //~^^ NOTE vtable kinds let _ = cf as *const Bar; //~^ ERROR casting //~^^ NOTE vtable kinds vec![0.0].iter().map(|s| s as f32).collect::<Vec<f32>>(); //~^ ERROR casting `&{float}` as `f32` is invalid //~| NOTE cannot cast `&{float}` as `f32` //~| NOTE did you mean `*s`? } </del>

<ins> // 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 illegal_cast<U:?Sized,V:?Sized>(u: *const U) -> *const V { u as *const V } fn illegal_cast_2<U:?Sized>(u: *const U) -> *const str { u as *const str } trait Foo { fn foo(&self) {} } impl<T> Foo for T {} trait Bar { fn foo(&self) {} } impl<T> Bar for T {} enum E { A, B } fn main() { let f: f32 = 1.2; let v = 0 as *const u8; let fat_v : *const [u8] = unsafe { &*(0 as *const [u8; 1])}; let fat_sv : *const [i8] = unsafe { &*(0 as *const [i8; 1])}; let foo: &Foo = &f; let _ = v as &u8; let _ = v as E; let _ = v as fn(); let _ = v as (u32,); let _ = Some(&v) as *const u8; let _ = v as f32; let _ = main as f64; let _ = &v as usize; let _ = f as *const u8; let _ = 3_i32 as bool; let _ = E::A as bool; let _ = 0x61u32 as char; let _ = false as f32; let _ = E::A as f32; let _ = 'a' as f32; let _ = false as *const u8; let _ = E::A as *const u8; let _ = 'a' as *const u8; let _ = 42usize as *const [u8]; let _ = v as *const [u8]; let _ = fat_v as *const Foo; let _ = foo as *const str; let _ = foo as *mut str; let _ = main as *mut str; let _ = &f as *mut f32; let _ = &f as *const f64; let _ = fat_sv as usize; let a : *const str = "hello"; let _ = a as *const Foo; // check no error cascade let _ = main.f as *const u32; let cf: *const Foo = &0; let _ = cf as *const [u16]; let _ = cf as *const Bar; vec![0.0].iter().map(|s| s as f32).collect::<Vec<f32>>(); } </ins>

<ins> error: casting `*const U` as `*const V` is invalid --> $DIR/cast-rfc0401.rs:13:5 | 13 |     u as *const V |     ^^^^^^^^^^^^^ | = note: vtable kinds may not match error: casting `*const U` as `*const str` is invalid --> $DIR/cast-rfc0401.rs:18:5 | 18 |     u as *const str |     ^^^^^^^^^^^^^^^ | = note: vtable kinds may not match error: no field `f` on type `fn() {main}` --> $DIR/cast-rfc0401.rs:75:18 | 75 |     let _ = main.f as *const u32; |                  ^ error: non-scalar cast: `*const u8` as `&u8` --> $DIR/cast-rfc0401.rs:39:13 | 39 |     let _ = v as &u8; |             ^^^^^^^^ error: non-scalar cast: `*const u8` as `E` --> $DIR/cast-rfc0401.rs:40:13 | 40 |     let _ = v as E; |             ^^^^^^ error: non-scalar cast: `*const u8` as `fn()` --> $DIR/cast-rfc0401.rs:41:13 | 41 |     let _ = v as fn(); |             ^^^^^^^^^ error: non-scalar cast: `*const u8` as `(u32,)` --> $DIR/cast-rfc0401.rs:42:13 | 42 |     let _ = v as (u32,); |             ^^^^^^^^^^^ error: non-scalar cast: `std::option::Option<&*const u8>` as `*const u8` --> $DIR/cast-rfc0401.rs:43:13 | 43 |     let _ = Some(&v) as *const u8; |             ^^^^^^^^^^^^^^^^^^^^^ error: casting `*const u8` as `f32` is invalid --> $DIR/cast-rfc0401.rs:45:13 | 45 |     let _ = v as f32; |             ^^^^^^^^ error: casting `fn() {main}` as `f64` is invalid --> $DIR/cast-rfc0401.rs:46:13 | 46 |     let _ = main as f64; |             ^^^^^^^^^^^ error: casting `&*const u8` as `usize` is invalid --> $DIR/cast-rfc0401.rs:47:13 | 47 |     let _ = &v as usize; |             ^^^^^^^^^^^ | = help: cast through a raw pointer first error: casting `f32` as `*const u8` is invalid --> $DIR/cast-rfc0401.rs:48:13 | 48 |     let _ = f as *const u8; |             ^^^^^^^^^^^^^^ error[E0054]: cannot cast as `bool` --> $DIR/cast-rfc0401.rs:49:13 | 49 |     let _ = 3_i32 as bool; |             ^^^^^^^^^^^^^ unsupported cast | = help: compare with zero instead error[E0054]: cannot cast as `bool` --> $DIR/cast-rfc0401.rs:50:13 | 50 |     let _ = E::A as bool; |             ^^^^^^^^^^^^ unsupported cast | = help: compare with zero instead error: only `u8` can be cast as `char`, not `u32` --> $DIR/cast-rfc0401.rs:51:13 | 51 |     let _ = 0x61u32 as char; |             ^^^^^^^^^^^^^^^ error: casting `bool` as `f32` is invalid --> $DIR/cast-rfc0401.rs:53:13 | 53 |     let _ = false as f32; |             ^^^^^^^^^^^^ | = help: cast through an integer first error: casting `E` as `f32` is invalid --> $DIR/cast-rfc0401.rs:54:13 | 54 |     let _ = E::A as f32; |             ^^^^^^^^^^^ | = help: cast through an integer first error: casting `char` as `f32` is invalid --> $DIR/cast-rfc0401.rs:55:13 | 55 |     let _ = 'a' as f32; |             ^^^^^^^^^^ | = help: cast through an integer first error: casting `bool` as `*const u8` is invalid --> $DIR/cast-rfc0401.rs:57:13 | 57 |     let _ = false as *const u8; |             ^^^^^^^^^^^^^^^^^^ error: casting `E` as `*const u8` is invalid --> $DIR/cast-rfc0401.rs:58:13 | 58 |     let _ = E::A as *const u8; |             ^^^^^^^^^^^^^^^^^ error: casting `char` as `*const u8` is invalid --> $DIR/cast-rfc0401.rs:59:13 | 59 |     let _ = 'a' as *const u8; |             ^^^^^^^^^^^^^^^^ error: casting `usize` as `*const [u8]` is invalid --> $DIR/cast-rfc0401.rs:61:13 | 61 |     let _ = 42usize as *const [u8]; |             ^^^^^^^^^^^^^^^^^^^^^^ error: cannot cast thin pointer `*const u8` to fat pointer `*const [u8]` --> $DIR/cast-rfc0401.rs:62:13 | 62 |     let _ = v as *const [u8]; |             ^^^^^^^^^^^^^^^^ error: casting `&Foo` as `*const str` is invalid --> $DIR/cast-rfc0401.rs:64:13 | 64 |     let _ = foo as *const str; |             ^^^^^^^^^^^^^^^^^ error: casting `&Foo` as `*mut str` is invalid --> $DIR/cast-rfc0401.rs:65:13 | 65 |     let _ = foo as *mut str; |             ^^^^^^^^^^^^^^^ error: casting `fn() {main}` as `*mut str` is invalid --> $DIR/cast-rfc0401.rs:66:13 | 66 |     let _ = main as *mut str; |             ^^^^^^^^^^^^^^^^ error: casting `&f32` as `*mut f32` is invalid --> $DIR/cast-rfc0401.rs:67:13 | 67 |     let _ = &f as *mut f32; |             ^^^^^^^^^^^^^^ error: casting `&f32` as `*const f64` is invalid --> $DIR/cast-rfc0401.rs:68:13 | 68 |     let _ = &f as *const f64; |             ^^^^^^^^^^^^^^^^ error: casting `*const [i8]` as `usize` is invalid --> $DIR/cast-rfc0401.rs:69:13 | 69 |     let _ = fat_sv as usize; |             ^^^^^^^^^^^^^^^ | = help: cast through a thin pointer first error: casting `*const Foo` as `*const [u16]` is invalid --> $DIR/cast-rfc0401.rs:78:13 | 78 |     let _ = cf as *const [u16]; |             ^^^^^^^^^^^^^^^^^^ | = note: vtable kinds may not match error: casting `*const Foo` as `*const Bar` is invalid --> $DIR/cast-rfc0401.rs:79:13 | 79 |     let _ = cf as *const Bar; |             ^^^^^^^^^^^^^^^^ | = note: vtable kinds may not match error[E0277]: the trait bound `[u8]: std::marker::Sized` is not satisfied --> $DIR/cast-rfc0401.rs:63:13 | 63 |     let _ = fat_v as *const Foo; |             ^^^^^ the trait `std::marker::Sized` is not implemented for `[u8]` | = note: `[u8]` does not have a constant size known at compile-time = note: required for the cast to the object type `Foo` error[E0277]: the trait bound `str: std::marker::Sized` is not satisfied --> $DIR/cast-rfc0401.rs:72:13 | 72 |     let _ = a as *const Foo; |             ^ the trait `std::marker::Sized` is not implemented for `str` | = note: `str` does not have a constant size known at compile-time = note: required for the cast to the object type `Foo` error: casting `&{float}` as `f32` is invalid --> $DIR/cast-rfc0401.rs:81:30 | 81 |     vec![0.0].iter().map(|s| s as f32).collect::<Vec<f32>>(); |                              ^^^^^^^^ cannot cast `&{float}` as `f32` | help: did you mean `*s`? --> $DIR/cast-rfc0401.rs:81:30 | 81 |     vec![0.0].iter().map(|s| s as f32).collect::<Vec<f32>>(); |                              ^ error: aborting due to 34 previous errors </ins>