// 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 } 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 _ => Box::new(0) }; } #[rustc_error] fn main() { foo(107) } //[gate_and_2015]~^^^ ERROR compilation successful //[gate_and_2018]~^^^^ ERROR compilation successful //[gate_and_znll]~^^^^^ ERROR compilation successful //[gate_and_feature_nll]~^^^^^^ ERROR compilation successful