diff --git a/src/librustc/middle/const_eval.rs b/src/librustc/middle/const_eval.rs index d6434e469b2d1..63122a82eafdf 100644 --- a/src/librustc/middle/const_eval.rs +++ b/src/librustc/middle/const_eval.rs @@ -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") - } - } - 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") + 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") + } } - } - _ => Err(~"Can't cast this type") } } expr_path(_) => {