From 9b55d86e74112361c560e49ca28a8fc71964adb9 Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Tue, 16 Apr 2013 04:13:37 +0900 Subject: [PATCH] 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. --- src/librustc/middle/const_eval.rs | 49 +++++++++++++++---------------- 1 file changed, 24 insertions(+), 25 deletions(-) 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(_) => {