Skip to content

Commit

Permalink
Check casts from fat pointer
Browse files Browse the repository at this point in the history
  • Loading branch information
sanxiyn committed Apr 7, 2015
1 parent f4c2228 commit d18b405
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 0 deletions.
5 changes: 5 additions & 0 deletions src/librustc_typeck/check/cast.rs
Expand Up @@ -170,6 +170,11 @@ pub fn check_cast<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>, cast: &CastCheck<'tcx>) {
demand::coerce(fcx, e.span, t_1, &e);
}
}
} else if fcx.type_is_fat_ptr(t_e, span) && !fcx.type_is_fat_ptr(t_1, span) {
fcx.type_error_message(span, |actual| {
format!("illegal cast; cast from fat pointer: `{}` as `{}`",
actual, fcx.infcx().ty_to_string(t_1))
}, t_e, None);
} else if !(t_e_is_scalar && t_1_is_trivial) {
/*
If more type combinations should be supported than are
Expand Down
10 changes: 10 additions & 0 deletions src/librustc_typeck/check/mod.rs
Expand Up @@ -1559,6 +1559,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
span)
}

pub fn type_is_fat_ptr(&self, ty: Ty<'tcx>, span: Span) -> bool {
match ty.sty {
ty::ty_ptr(ty::mt { ty: t, .. }) |
ty::ty_rptr(_, ty::mt { ty: t, .. }) => {
!self.type_is_known_to_be_sized(t, span)
}
_ => false
}
}

pub fn register_builtin_bound(&self,
ty: Ty<'tcx>,
builtin_bound: ty::BuiltinBound,
Expand Down
14 changes: 14 additions & 0 deletions src/test/compile-fail/fat-ptr-cast.rs
@@ -0,0 +1,14 @@
// 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 main() {
let a: &[i32] = &[1, 2, 3];
a as *const [i32] as usize; //~ ERROR cast from fat pointer
}

0 comments on commit d18b405

Please sign in to comment.