improve const eval error reporting on "" and b"" casts

This commit is contained in:
Oliver Schneider 2016-07-22 09:34:44 +02:00
parent e7c822cee2
commit e8ac07941c
No known key found for this signature in database
GPG Key ID: 56D6EEA0FC67AC46
2 changed files with 20 additions and 3 deletions

View File

@ -1105,11 +1105,25 @@ fn cast_const<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, val: ConstVal, ty: ty::Ty)
Float(f) => cast_const_float(tcx, f, ty), Float(f) => cast_const_float(tcx, f, ty),
Char(c) => cast_const_int(tcx, Infer(c as u64), ty), Char(c) => cast_const_int(tcx, Infer(c as u64), ty),
Function(_) => Err(UnimplementedConstVal("casting fn pointers")), Function(_) => Err(UnimplementedConstVal("casting fn pointers")),
ByteStr(_) => match ty.sty { ByteStr(b) => match ty.sty {
ty::TyRawPtr(_) => { ty::TyRawPtr(_) => {
Err(ErrKind::UnimplementedConstVal("casting a bytestr to a raw ptr")) Err(ErrKind::UnimplementedConstVal("casting a bytestr to a raw ptr"))
}, },
ty::TyRef(..) => Err(ErrKind::UnimplementedConstVal("casting a bytestr to slice")), ty::TyRef(_, ty::TypeAndMut { ref ty, mutbl: hir::MutImmutable }) => match ty.sty {
ty::TyArray(ty, n) if ty == tcx.types.u8 && n == b.len() => Ok(ByteStr(b)),
ty::TySlice(_) => {
Err(ErrKind::UnimplementedConstVal("casting a bytestr to slice"))
},
_ => Err(CannotCast),
},
_ => Err(CannotCast),
},
Str(s) => match ty.sty {
ty::TyRawPtr(_) => Err(ErrKind::UnimplementedConstVal("casting a str to a raw ptr")),
ty::TyRef(_, ty::TypeAndMut { ref ty, mutbl: hir::MutImmutable }) => match ty.sty {
ty::TyStr => Ok(Str(s)),
_ => Err(CannotCast),
},
_ => Err(CannotCast), _ => Err(CannotCast),
}, },
_ => Err(CannotCast), _ => Err(CannotCast),

View File

@ -1,4 +1,4 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT // Copyright 2016 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at // file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT. // http://rust-lang.org/COPYRIGHT.
// //
@ -12,4 +12,7 @@
pub fn main() { pub fn main() {
let _ = b"x" as &[u8]; let _ = b"x" as &[u8];
let _ = b"y" as &[u8; 1];
let _ = b"z" as *const u8;
let _ = "ä" as *const str;
} }