1 // Check that pattern-guards with move-bound variables is only allowed
2 // with the appropriate set of feature gates. (Note that we require
3 // the code to opt into MIR-borrowck in *some* way before the feature
4 // will work; we use the revision system here to enumerate a number of
5 // ways that opt-in could occur.)
7 // gate-test-bind_by_move_pattern_guards
9 // revisions: no_gate gate_and_2015 gate_and_2018 gate_and_znll gate_and_feature_nll
11 // (We're already testing NLL behavior quite explicitly, no need for compare-mode=nll.)
12 // ignore-compare-mode-nll
14 #![feature(rustc_attrs)]
16 #![cfg_attr(gate_and_2015, feature(bind_by_move_pattern_guards))]
17 #![cfg_attr(gate_and_2018, feature(bind_by_move_pattern_guards))]
18 #![cfg_attr(gate_and_znll, feature(bind_by_move_pattern_guards))]
19 #![cfg_attr(gate_and_feature_nll, feature(bind_by_move_pattern_guards))]
21 #![cfg_attr(gate_and_feature_nll, feature(nll))]
23 //[gate_and_2015] edition:2015
24 //[gate_and_2018] edition:2018
25 //[gate_and_znll] compile-flags: -Z borrowck=mir
27 struct A { a: Box<i32> }
30 let x = A { a: Box::new(n) };
33 A { a: v } if *v == 42 => v,
34 //[no_gate]~^ ERROR cannot bind by-move into a pattern guard
35 //[gate_and_2015]~^^ ERROR cannot bind by-move into a pattern guard
45 //[gate_and_2018]~^^^ ERROR compilation successful
46 //[gate_and_znll]~^^^^ ERROR compilation successful
47 //[gate_and_feature_nll]~^^^^^ ERROR compilation successful