From 5bf268d0b028d8e8abe62166c533f8515955bc6b Mon Sep 17 00:00:00 2001 From: Edward Wang Date: Tue, 13 May 2014 13:20:52 +0800 Subject: [PATCH] Fix #8391 Closes #8391 --- src/librustc/middle/check_match.rs | 10 +++++++++- src/test/run-pass/issue-8391.rs | 5 +++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/librustc/middle/check_match.rs b/src/librustc/middle/check_match.rs index ecadc6138715f..c08078ff86b5d 100644 --- a/src/librustc/middle/check_match.rs +++ b/src/librustc/middle/check_match.rs @@ -239,7 +239,15 @@ fn is_useful(cx: &MatchCheckCtxt, m: &matrix, v: &[@Pat]) -> useful { return not_useful } let real_pat = match m.iter().find(|r| r.get(0).id != 0) { - Some(r) => *r.get(0), None => v[0] + Some(r) => { + match r.get(0).node { + // An arm of the form `ref x @ sub_pat` has type + // `sub_pat`, not `&sub_pat` as `x` itself does. + PatIdent(BindByRef(_), _, Some(sub)) => sub, + _ => *r.get(0) + } + } + None => v[0] }; let left_ty = if real_pat.id == 0 { ty::mk_nil() } else { ty::node_id_to_type(cx.tcx, real_pat.id) }; diff --git a/src/test/run-pass/issue-8391.rs b/src/test/run-pass/issue-8391.rs index fdd27f8542fc7..86c9b8c696469 100644 --- a/src/test/run-pass/issue-8391.rs +++ b/src/test/run-pass/issue-8391.rs @@ -9,8 +9,9 @@ // except according to those terms. fn main() { - let _x = match Some(1) { - _y @ Some(_) => 1, + let x = match Some(1) { + ref _y @ Some(_) => 1, None => 2, }; + assert_eq!(x, 1); }