-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[NLL] make temp for each candidate in match
arm
#52733
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
c636ded
97f3d21
a0ac188
9462645
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -126,7 +126,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { | |
None, | ||
remainder_span, | ||
lint_level, | ||
&pattern, | ||
&[pattern.clone()], | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. is this just to convert from There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh, hey, the libs team finally gave in: https://doc.rust-lang.org/std/slice/fn.from_ref.html well, I guess it's still unstable. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i was lazy. will fix. |
||
ArmHasGuard(false), | ||
Some((None, initializer_span)), | ||
); | ||
|
@@ -138,8 +138,9 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { | |
}) | ||
})); | ||
} else { | ||
scope = this.declare_bindings(None, remainder_span, lint_level, &pattern, | ||
ArmHasGuard(false), None); | ||
scope = this.declare_bindings( | ||
None, remainder_span, lint_level, &[pattern.clone()], | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same here, |
||
ArmHasGuard(false), None); | ||
|
||
// FIXME(#47184): We currently only insert `UserAssertTy` statements for | ||
// patterns that are bindings, this is as we do not want to deconstruct | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT | ||
// file at the top-level directory of this distribution and at | ||
// http://rust-lang.org/COPYRIGHT. | ||
// | ||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | ||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | ||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | ||
// option. This file may not be copied, modified, or distributed | ||
// except according to those terms. | ||
|
||
// We used to ICE if you had a single match arm with multiple | ||
// candidate patterns with `ref mut` identifiers used in the arm's | ||
// guard. | ||
// | ||
// Also, this test expands on the original bug's example by actually | ||
// trying to double check that we are matching against the right part | ||
// of the input data based on which candidate pattern actually fired. | ||
|
||
// run-pass | ||
|
||
#![feature(nll)] | ||
|
||
fn foo(x: &mut Result<(u32, u32), (u32, u32)>) -> u32 { | ||
match *x { | ||
Ok((ref mut v, _)) | Err((_, ref mut v)) if *v > 0 => { *v } | ||
_ => { 0 } | ||
} | ||
} | ||
|
||
fn main() { | ||
assert_eq!(foo(&mut Ok((3, 4))), 3); | ||
assert_eq!(foo(&mut Err((3, 4))), 4); | ||
} |
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.
too bad we don't have NLL already! =)