Rollup merge of #34972 - oli-obk:cant_cast_str_to_const_ptr, r=eddyb
improve const eval error reporting on "" and b"" casts r? @eddyb cc @ubsan
This commit is contained in:
commit
87cc1b9330
2 changed files with 20 additions and 3 deletions
|
@ -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),
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue