-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This will help not to meet confusing errors. In issue rust-lang#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.
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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 { | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
youknowone
Author
Owner
|
||
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(_) => { | ||
|
1 comment
on commit 9b55d86
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
r+
You should be able to rewrite this to avoid the copy, by adding the
ref
keyword to the binding forbase
and to all the other sub-patterns here (such asval
).