Skip to content

Commit

Permalink
Prevent eval_const_expr_partial hides prior error in expr_cast arm.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
youknowone committed Apr 15, 2013
1 parent 1ab1354 commit 9b55d86
Showing 1 changed file with 24 additions and 25 deletions.
49 changes: 24 additions & 25 deletions src/librustc/middle/const_eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(_) => {
Expand Down

5 comments on commit 9b55d86

@bors
Copy link
Contributor

@bors bors commented on 9b55d86 Apr 16, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saw approval from catamorphism
at youknowone@9b55d86

@bors
Copy link
Contributor

@bors bors commented on 9b55d86 Apr 16, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

merging youknowone/rust/const-eval = 9b55d86 into auto

@bors
Copy link
Contributor

@bors bors commented on 9b55d86 Apr 16, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

youknowone/rust/const-eval = 9b55d86 merged ok, testing candidate = 07e087b

@bors
Copy link
Contributor

@bors bors commented on 9b55d86 Apr 16, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bors
Copy link
Contributor

@bors bors commented on 9b55d86 Apr 16, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fast-forwarding incoming to auto = 07e087b

Please sign in to comment.