mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-02 03:33:59 +00:00
Prevent eval_const_expr_partial hides prior error in expr_cast arm.
This will help not to meet confusing errors. In issue #5873, the error was "expected constant expr for vector length: Can't cast str to int". It was originally "expected constant expr for vector length: Non-constant path in constant expr" This patch make the original error to be printed.
This commit is contained in:
parent
1ab1354937
commit
9b55d86e74
@ -371,32 +371,31 @@ pub fn eval_const_expr_partial(tcx: middle::ty::ctxt, e: @expr)
|
||||
expr_cast(base, _) => {
|
||||
let ety = ty::expr_ty(tcx, e);
|
||||
let base = eval_const_expr_partial(tcx, base);
|
||||
match ty::get(ety).sty {
|
||||
ty::ty_float(_) => {
|
||||
match base {
|
||||
Ok(const_uint(u)) => Ok(const_float(u as f64)),
|
||||
Ok(const_int(i)) => Ok(const_float(i as f64)),
|
||||
Ok(const_float(_)) => base,
|
||||
_ => Err(~"Can't cast float to str")
|
||||
match /*bad*/copy base {
|
||||
Err(_) => base,
|
||||
Ok(val) => {
|
||||
match ty::get(ety).sty {
|
||||
ty::ty_float(_) => match val {
|
||||
const_uint(u) => Ok(const_float(u as f64)),
|
||||
const_int(i) => Ok(const_float(i as f64)),
|
||||
const_float(_) => base,
|
||||
_ => Err(~"Can't cast float to str"),
|
||||
},
|
||||
ty::ty_uint(_) => match val {
|
||||
const_uint(_) => base,
|
||||
const_int(i) => Ok(const_uint(i as u64)),
|
||||
const_float(f) => Ok(const_uint(f as u64)),
|
||||
_ => Err(~"Can't cast str to uint"),
|
||||
},
|
||||
ty::ty_int(_) | ty::ty_bool => match val {
|
||||
const_uint(u) => Ok(const_int(u as i64)),
|
||||
const_int(_) => base,
|
||||
const_float(f) => Ok(const_int(f as i64)),
|
||||
_ => Err(~"Can't cast str to int"),
|
||||
},
|
||||
_ => Err(~"Can't cast this type")
|
||||
}
|
||||
}
|
||||
}
|
||||
ty::ty_uint(_) => {
|
||||
match base {
|
||||
Ok(const_uint(_)) => base,
|
||||
Ok(const_int(i)) => Ok(const_uint(i as u64)),
|
||||
Ok(const_float(f)) => Ok(const_uint(f as u64)),
|
||||
_ => Err(~"Can't cast str to uint")
|
||||
}
|
||||
}
|
||||
ty::ty_int(_) | ty::ty_bool => {
|
||||
match base {
|
||||
Ok(const_uint(u)) => Ok(const_int(u as i64)),
|
||||
Ok(const_int(_)) => base,
|
||||
Ok(const_float(f)) => Ok(const_int(f as i64)),
|
||||
_ => Err(~"Can't cast str to int")
|
||||
}
|
||||
}
|
||||
_ => Err(~"Can't cast this type")
|
||||
}
|
||||
}
|
||||
expr_path(_) => {
|
||||
|
Loading…
Reference in New Issue
Block a user