Skip to content

Commit 17360e3

Browse files
committed
---
yaml --- r: 193388 b: refs/heads/beta c: 5d950bd h: refs/heads/master v: v3
1 parent ebcf2fb commit 17360e3

File tree

2 files changed

+22
-15
lines changed

2 files changed

+22
-15
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ refs/heads/automation-fail: 1bf06495443584539b958873e04cc2f864ab10e4
3131
refs/heads/issue-18208-method-dispatch-3-quick-reject: 2009f85b9f99dedcec4404418eda9ddba90258a2
3232
refs/heads/batch: b7fd822592a4fb577552d93010c4a4e14f314346
3333
refs/heads/building: 126db549b038c84269a1e4fe46f051b2c15d6970
34-
refs/heads/beta: e919f82da1fb9fa0409f8febede311de4a8f1703
34+
refs/heads/beta: 5d950bd37d9f4ef46798b79d38d9d91927bb0cf4
3535
refs/heads/windistfix: 7608dbad651f02e837ed05eef3d74a6662a6e928
3636
refs/tags/1.0.0-alpha: e42bd6d93a1d3433c486200587f8f9e12590a4d7
3737
refs/heads/tmp: de8a23bbc3a7b9cbd7574b5b91a34af59bf030e6

branches/beta/src/librustc/middle/check_match.rs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ use self::Usefulness::*;
1313
use self::WitnessPreference::*;
1414

1515
use middle::const_eval::{compare_const_vals, const_bool, const_float, const_val};
16-
use middle::const_eval::{const_expr_to_pat, eval_const_expr, lookup_const_by_id};
16+
use middle::const_eval::{eval_const_expr, eval_const_expr_partial};
17+
use middle::const_eval::{const_expr_to_pat, lookup_const_by_id};
1718
use middle::def::*;
1819
use middle::expr_use_visitor::{ConsumeMode, Delegate, ExprUseVisitor, Init};
1920
use middle::expr_use_visitor::{JustWrite, LoanCause, MutateMode};
@@ -229,13 +230,6 @@ fn check_expr(cx: &mut MatchCheckCtxt, ex: &ast::Expr) {
229230
}
230231
}
231232

232-
fn is_expr_const_nan(tcx: &ty::ctxt, expr: &ast::Expr) -> bool {
233-
match eval_const_expr(tcx, expr) {
234-
const_float(f) => f.is_nan(),
235-
_ => false
236-
}
237-
}
238-
239233
fn check_for_bindings_named_the_same_as_variants(cx: &MatchCheckCtxt, pat: &Pat) {
240234
ast_util::walk_pat(pat, |p| {
241235
match p.node {
@@ -269,13 +263,26 @@ fn check_for_bindings_named_the_same_as_variants(cx: &MatchCheckCtxt, pat: &Pat)
269263
// Check that we do not match against a static NaN (#6804)
270264
fn check_for_static_nan(cx: &MatchCheckCtxt, pat: &Pat) {
271265
ast_util::walk_pat(pat, |p| {
272-
match p.node {
273-
ast::PatLit(ref expr) if is_expr_const_nan(cx.tcx, &**expr) => {
274-
span_warn!(cx.tcx.sess, p.span, E0003,
275-
"unmatchable NaN in pattern, \
276-
use the is_nan method in a guard instead");
266+
if let ast::PatLit(ref expr) = p.node {
267+
match eval_const_expr_partial(cx.tcx, &**expr, None) {
268+
Ok(const_float(f)) if f.is_nan() => {
269+
span_warn!(cx.tcx.sess, p.span, E0003,
270+
"unmatchable NaN in pattern, \
271+
use the is_nan method in a guard instead");
272+
}
273+
Ok(_) => {}
274+
275+
Err(err) => {
276+
let subspan = p.span.lo <= err.span.lo && err.span.hi <= p.span.hi;
277+
cx.tcx.sess.span_err(err.span,
278+
&format!("constant evaluation error: {}",
279+
err.description().as_slice()));
280+
if !subspan {
281+
cx.tcx.sess.span_note(p.span,
282+
"in pattern here")
283+
}
284+
}
277285
}
278-
_ => ()
279286
}
280287
true
281288
});

0 commit comments

Comments
 (0)