Skip to content

Commit

Permalink
Reject casts to unsized types and suggest use of reference or box
Browse files Browse the repository at this point in the history
This prevents ICEs or less helpful diagnostics if typeck proceeds
further.  Closes issue rust-lang#17441
  • Loading branch information
bkoropoff committed Sep 29, 2014
1 parent 34dfa45 commit ca15637
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/librustc/middle/typeck/check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1405,6 +1405,37 @@ fn check_cast(fcx: &FnCtxt,
return
}

if !ty::type_is_sized(fcx.tcx(), t_1) {
let tstr = fcx.infcx().ty_to_string(t_1);
fcx.type_error_message(span, |actual| {
format!("cast to unsized type: `{}` as `{}`", actual, tstr)
}, t_e, None);
match ty::get(t_e).sty {
ty::ty_rptr(_, ty::mt { mutbl: mt, .. }) => {
let mtstr = match mt {
ast::MutMutable => "mut ",
ast::MutImmutable => ""
};
if ty::type_is_trait(t_1) {
span_note!(fcx.tcx().sess, t.span, "did you mean `&{}{}`?", mtstr, tstr);
} else {
span_note!(fcx.tcx().sess, span,
"consider using an implicit coercion to `&{}{}` instead",
mtstr, tstr);
}
}
ty::ty_uniq(..) => {
span_note!(fcx.tcx().sess, t.span, "did you mean `Box<{}>`?", tstr);
}
_ => {
span_note!(fcx.tcx().sess, e.span,
"consider using a box or reference as appropriate");
}
}
fcx.write_error(id);
return
}

if ty::type_is_trait(t_1) {
// This will be looked up later on.
vtable2::check_object_cast(fcx, cast_expr, e, t_1);
Expand Down

0 comments on commit ca15637

Please sign in to comment.