Change:
Once (), i.e. in nested positions, e.g. have progressed sufficiently in their implementation, e.g. when the MIR building implementation is done, we should extend the test suite for (), e.g. , to exercise the combination of these two features. Ideally, we would also account for the combination of those two with () and () as well to make things really air-tight. <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --This issue has been assigned to via . <!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOT_END --
This is almost unblocked now that has landed. However, we need more progress on or-patterns.
Can I work on this one?
Sure, go right ahead. assign
Error: Parsing assign command in failed: thekuom... Please let know if you're having trouble with this bot.
Sure, go right ahead. assign

Discussion:
<ins> // Tests using a combination of pattern features has the expected borrow checking behavior #![feature(bindings_after_at)] #![feature(or_patterns)] #![feature(box_patterns)] #![feature(move_ref_pattern)] enum Test { Foo, Bar, _Baz, } // bindings_after_at + slice_patterns fn bindings_after_at_slice_patterns_move_binding(x: [String; 4]) { match x { a @ [.., _] => (), _ => (), }; &x; //~^ ERROR borrow of moved value } fn bindings_after_at_slice_patterns_borrows_binding_mut(mut x: [String; 4]) { let r = match x { ref mut foo @ [.., _] => Some(foo), _ => None, }; &x; //~^ ERROR cannot borrow drop(r); } fn bindings_after_at_slice_patterns_borrows_slice_mut1(mut x: [String; 4]) { let r = match x { ref foo @ [.., ref mut bar] => (), //~^ ERROR cannot borrow _ => (), }; drop(r); } fn bindings_after_at_slice_patterns_borrows_slice_mut2(mut x: [String; 4]) { let r = match x { [ref foo @ .., ref bar] => Some(foo), _ => None, }; &mut x; //~^ ERROR cannot borrow drop(r); } fn bindings_after_at_slice_patterns_borrows_both(mut x: [String; 4]) { let r = match x { ref foo @ [.., ref bar] => Some(foo), _ => None, }; &mut x; //~^ ERROR cannot borrow drop(r); } // bindings_after_at + or_patterns fn bindings_after_at_or_patterns_move(x: Option<Test>) { match x { foo @ Some(Test::Foo | Test::Bar) => (), _ => (), } &x; //~^ ERROR borrow of moved value } fn bindings_after_at_or_patterns_borrows(mut x: Option<Test>) { let r = match x { ref foo @ Some(Test::Foo | Test::Bar) => Some(foo), _ => None, }; &mut x; //~^ ERROR cannot borrow drop(r); } fn bindings_after_at_or_patterns_borrows_mut(mut x: Option<Test>) { let r = match x { ref mut foo @ Some(Test::Foo | Test::Bar) => Some(foo), _ => None, }; &x; //~^ ERROR cannot borrow drop(r); } // bindings_after_at + box_patterns fn bindings_after_at_box_patterns_borrows_both(mut x: Option<Box<String>>) { let r = match x { ref foo @ Some(box ref s) => Some(foo), _ => None, }; &mut x; //~^ ERROR cannot borrow drop(r); } fn bindings_after_at_box_patterns_borrows_mut(mut x: Option<Box<String>>) { match x { ref foo @ Some(box ref mut s) => (), //~^ ERROR cannot borrow _ => (), }; } // bindings_after_at + slice_patterns + or_patterns fn bindings_after_at_slice_patterns_or_patterns_moves(x: [Option<Test>; 4]) { match x { a @ [.., Some(Test::Foo | Test::Bar)] => (), _ => (), }; &x; //~^ ERROR borrow of moved value } fn bindings_after_at_slice_patterns_or_patterns_borrows_binding(mut x: [Option<Test>; 4]) { let r = match x { ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(a), _ => None, }; &mut x; //~^ ERROR cannot borrow drop(r); } fn bindings_after_at_slice_patterns_or_patterns_borrows_slice(mut x: [Option<Test>; 4]) { let r = match x { ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(b), _ => None, }; &mut x; //~^ ERROR cannot borrow drop(r); } // bindings_after_at + slice_patterns + box_patterns fn bindings_after_at_slice_patterns_box_patterns_borrows(mut x: [Option<Box<String>>; 4]) { let r = match x { [_, ref a @ Some(box ref b), ..] => Some(a), _ => None, }; &mut x; //~^ ERROR cannot borrow drop(r); } // bindings_after_at + slice_patterns + or_patterns + box_patterns fn bindings_after_at_slice_patterns_or_patterns_box_patterns_borrows( mut x: [Option<Box<Test>>; 4] ) { let r = match x { [_, ref a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a), _ => None, }; &mut x; //~^ ERROR cannot borrow drop(r); } fn bindings_after_at_slice_patterns_or_patterns_box_patterns_borrows_mut( mut x: [Option<Box<Test>>; 4] ) { let r = match x { [_, ref mut a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a), _ => None, }; &x; //~^ ERROR cannot borrow drop(r); } fn bindings_after_at_slice_patterns_or_patterns_box_patterns_borrows_binding( mut x: [Option<Box<Test>>; 4] ) { let r = match x { ref a @ [_, ref b @ Some(box Test::Foo | box Test::Bar), ..] => Some(a), _ => None, }; &mut x; //~^ ERROR cannot borrow drop(r); } fn main() {} </ins>

<ins> error: cannot borrow value as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:40:9 | LL |         ref foo @ [.., ref mut bar] => (), |         -------^^^^^^^^-----------^ |         |              | |         |              mutable borrow, by `bar`, occurs here |         immutable borrow, by `foo`, occurs here error: cannot borrow value as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:124:9 | LL |         ref foo @ Some(box ref mut s) => (), |         -------^^^^^^^^^^^^---------^ |         |                  | |         |                  mutable borrow, by `s`, occurs here |         immutable borrow, by `foo`, occurs here error[E0382]: borrow of moved value: `x` --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:22:5 | LL | fn bindings_after_at_slice_patterns_move_binding(x: [String; 4]) { |                                                  - move occurs because `x` has type `[std::string::String; 4]`, which does not implement the `Copy` trait LL |     match x { LL |         a @ [.., _] => (), |         ----------- value moved here ... LL |     &x; |     ^^ value borrowed here after move error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:32:5 | LL |         ref mut foo @ [.., _] => Some(foo), |         --------------------- mutable borrow occurs here ... LL |     &x; |     ^^ immutable borrow occurs here ... LL |     drop(r); |          - mutable borrow later used here error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:54:5 | LL |         [ref foo @ .., ref bar] => Some(foo), |          ------------ immutable borrow occurs here ... LL |     &mut x; |     ^^^^^^ mutable borrow occurs here ... LL |     drop(r); |          - immutable borrow later used here error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:66:5 | LL |         ref foo @ [.., ref bar] => Some(foo), |         ----------------------- immutable borrow occurs here ... LL |     &mut x; |     ^^^^^^ mutable borrow occurs here ... LL |     drop(r); |          - immutable borrow later used here error[E0382]: borrow of moved value: `x` --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:80:5 | LL | fn bindings_after_at_or_patterns_move(x: Option<Test>) { |                                       - move occurs because `x` has type `std::option::Option<Test>`, which does not implement the `Copy` trait LL |     match x { LL |         foo @ Some(Test::Foo | Test::Bar) => (), |         --------------------------------- |         | |         value moved here |         value moved here ... LL |     &x; |     ^^ value borrowed here after move error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:90:5 | LL |         ref foo @ Some(Test::Foo | Test::Bar) => Some(foo), |         ------------------------------------- immutable borrow occurs here ... LL |     &mut x; |     ^^^^^^ mutable borrow occurs here ... LL |     drop(r); |          - immutable borrow later used here error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:102:5 | LL |         ref mut foo @ Some(Test::Foo | Test::Bar) => Some(foo), |         ----------------------------------------- mutable borrow occurs here ... LL |     &x; |     ^^ immutable borrow occurs here ... LL |     drop(r); |          - mutable borrow later used here error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:116:5 | LL |         ref foo @ Some(box ref s) => Some(foo), |         ------------------------- immutable borrow occurs here ... LL |     &mut x; |     ^^^^^^ mutable borrow occurs here ... LL |     drop(r); |          - immutable borrow later used here error[E0382]: borrow of moved value: `x` --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:138:5 | LL | fn bindings_after_at_slice_patterns_or_patterns_moves(x: [Option<Test>; 4]) { |                                                       - move occurs because `x` has type `[std::option::Option<Test>; 4]`, which does not implement the `Copy` trait LL |     match x { LL |         a @ [.., Some(Test::Foo | Test::Bar)] => (), |         ------------------------------------- |         | |         value moved here |         value moved here ... LL |     &x; |     ^^ value borrowed here after move error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:148:5 | LL |         ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(a), |         ------------------------------------------------- immutable borrow occurs here ... LL |     &mut x; |     ^^^^^^ mutable borrow occurs here ... LL |     drop(r); |          - immutable borrow later used here error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:160:5 | LL |         ref a @ [ref b @ .., Some(Test::Foo | Test::Bar)] => Some(b), |                  ---------- immutable borrow occurs here ... LL |     &mut x; |     ^^^^^^ mutable borrow occurs here ... LL |     drop(r); |          - immutable borrow later used here error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:174:5 | LL |         [_, ref a @ Some(box ref b), ..] => Some(a), |             ----------------------- immutable borrow occurs here ... LL |     &mut x; |     ^^^^^^ mutable borrow occurs here ... LL |     drop(r); |          - immutable borrow later used here error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:190:5 | LL |         [_, ref a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a), |             ------------------------------------------- immutable borrow occurs here ... LL |     &mut x; |     ^^^^^^ mutable borrow occurs here ... LL |     drop(r); |          - immutable borrow later used here error[E0502]: cannot borrow `x` as immutable because it is also borrowed as mutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:204:5 | LL |         [_, ref mut a @ Some(box Test::Foo | box Test::Bar), ..] => Some(a), |             ----------------------------------------------- mutable borrow occurs here ... LL |     &x; |     ^^ immutable borrow occurs here ... LL |     drop(r); |          - mutable borrow later used here error[E0502]: cannot borrow `x` as mutable because it is also borrowed as immutable --> $DIR/bindings-after-at-or-patterns-slice-patterns-box-patterns.rs:218:5 | LL |         ref a @ [_, ref b @ Some(box Test::Foo | box Test::Bar), ..] => Some(a), |         ------------------------------------------------------------ immutable borrow occurs here ... LL |     &mut x; |     ^^^^^^ mutable borrow occurs here ... LL |     drop(r); |          - immutable borrow later used here error: aborting due to 17 previous errors Some errors have detailed explanations: E0382, E0502. For more information about an error, try `rustc --explain E0382`. </ins>