| // Check that pattern-guards with move-bound variables is only allowed |
| // with the appropriate set of feature gates. (Note that we require |
| // the code to opt into MIR-borrowck in *some* way before the feature |
| // will work; we use the revision system here to enumerate a number of |
| // ways that opt-in could occur.) |
| |
| // gate-test-bind_by_move_pattern_guards |
| |
| // revisions: no_gate gate_and_2015 gate_and_2018 gate_and_znll gate_and_feature_nll |
| |
| // (We're already testing NLL behavior quite explicitly, no need for compare-mode=nll.) |
| // ignore-compare-mode-nll |
| |
| #![feature(rustc_attrs)] |
| |
| #![cfg_attr(gate_and_2015, feature(bind_by_move_pattern_guards))] |
| #![cfg_attr(gate_and_2018, feature(bind_by_move_pattern_guards))] |
| #![cfg_attr(gate_and_znll, feature(bind_by_move_pattern_guards))] |
| #![cfg_attr(gate_and_feature_nll, feature(bind_by_move_pattern_guards))] |
| |
| #![cfg_attr(gate_and_feature_nll, feature(nll))] |
| |
| //[gate_and_2015] edition:2015 |
| //[gate_and_2018] edition:2018 |
| //[gate_and_znll] compile-flags: -Z borrowck=mir |
| |
| struct A { a: Box<i32> } |
| |
| fn foo(n: i32) { |
| let x = A { a: Box::new(n) }; |
| let _y = match x { |
| |
| A { a: v } if *v == 42 => v, |
| //[no_gate]~^ ERROR cannot bind by-move into a pattern guard |
| //[gate_and_2015]~^^ ERROR cannot bind by-move into a pattern guard |
| |
| _ => Box::new(0) |
| }; |
| } |
| |
| #[rustc_error] |
| fn main() { |
| foo(107) |
| } |
| //[gate_and_2018]~^^^ ERROR compilation successful |
| //[gate_and_znll]~^^^^ ERROR compilation successful |
| //[gate_and_feature_nll]~^^^^^ ERROR compilation successful |