Tests for feature(bind_by_move_pattern_guards)
.
Apparently copyright notices are no longer necessary apparently. (See #43498 and #53654.)
This commit is contained in:
parent
7d844e871c
commit
c50884c615
14 changed files with 208 additions and 11 deletions
|
@ -1,13 +1,3 @@
|
||||||
// Copyright 2012 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.
|
|
||||||
|
|
||||||
use std::sync::mpsc::channel;
|
use std::sync::mpsc::channel;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
error[E0008]: cannot bind by-move into a pattern guard
|
error[E0008]: cannot bind by-move into a pattern guard
|
||||||
--> $DIR/bind-by-move-no-guards.rs:18:14
|
--> $DIR/bind-by-move-no-guards.rs:8:14
|
||||||
|
|
|
|
||||||
LL | Some(z) if z.recv().unwrap() => { panic!() },
|
LL | Some(z) if z.recv().unwrap() => { panic!() },
|
||||||
| ^ moves value into pattern guard
|
| ^ moves value into pattern guard
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
// Adaptation of existing ui test (from way back in
|
||||||
|
// rust-lang/rust#2329), that starts passing with this feature in
|
||||||
|
// place.
|
||||||
|
|
||||||
|
// compile-pass
|
||||||
|
|
||||||
|
#![feature(nll)]
|
||||||
|
#![feature(bind_by_move_pattern_guards)]
|
||||||
|
|
||||||
|
use std::sync::mpsc::channel;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let (tx, rx) = channel();
|
||||||
|
let x = Some(rx);
|
||||||
|
tx.send(false);
|
||||||
|
match x {
|
||||||
|
Some(z) if z.recv().unwrap() => { panic!() },
|
||||||
|
Some(z) => { assert!(!z.recv().unwrap()); },
|
||||||
|
None => panic!()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0008]: cannot bind by-move into a pattern guard
|
||||||
|
--> $DIR/feature-gate.rs:33:16
|
||||||
|
|
|
||||||
|
LL | A { a: v } if *v == 42 => v,
|
||||||
|
| ^ moves value into pattern guard
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0008`.
|
|
@ -0,0 +1,10 @@
|
||||||
|
error: compilation successful
|
||||||
|
--> $DIR/feature-gate.rs:42:1
|
||||||
|
|
|
||||||
|
LL | / fn main() {
|
||||||
|
LL | | foo(107)
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
error: compilation successful
|
||||||
|
--> $DIR/feature-gate.rs:42:1
|
||||||
|
|
|
||||||
|
LL | / fn main() {
|
||||||
|
LL | | foo(107)
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
error: compilation successful
|
||||||
|
--> $DIR/feature-gate.rs:42:1
|
||||||
|
|
|
||||||
|
LL | / fn main() {
|
||||||
|
LL | | foo(107)
|
||||||
|
LL | | }
|
||||||
|
| |_^
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0008]: cannot bind by-move into a pattern guard
|
||||||
|
--> $DIR/feature-gate.rs:33:16
|
||||||
|
|
|
||||||
|
LL | A { a: v } if *v == 42 => v,
|
||||||
|
| ^ moves value into pattern guard
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0008`.
|
|
@ -0,0 +1,47 @@
|
||||||
|
// 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
|
|
@ -0,0 +1,40 @@
|
||||||
|
#![feature(nll)]
|
||||||
|
#![feature(bind_by_move_pattern_guards)]
|
||||||
|
|
||||||
|
// compile-pass
|
||||||
|
|
||||||
|
struct A { a: Box<i32> }
|
||||||
|
|
||||||
|
impl A {
|
||||||
|
fn get(&self) -> i32 { *self.a }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn foo(n: i32) {
|
||||||
|
let x = A { a: Box::new(n) };
|
||||||
|
let y = match x {
|
||||||
|
A { a: v } if *v == 42 => v,
|
||||||
|
_ => Box::new(0),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bar(n: i32) {
|
||||||
|
let x = A { a: Box::new(n) };
|
||||||
|
let y = match x {
|
||||||
|
A { a: v } if x.get() == 42 => v,
|
||||||
|
_ => Box::new(0),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn baz(n: i32) {
|
||||||
|
let x = A { a: Box::new(n) };
|
||||||
|
let y = match x {
|
||||||
|
A { a: v } if *v.clone() == 42 => v,
|
||||||
|
_ => Box::new(0),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
foo(107);
|
||||||
|
bar(107);
|
||||||
|
baz(107);
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
#![feature(nll)]
|
||||||
|
#![feature(bind_by_move_pattern_guards)]
|
||||||
|
|
||||||
|
enum VecWrapper { A(Vec<i32>) }
|
||||||
|
|
||||||
|
fn foo(x: VecWrapper) -> usize {
|
||||||
|
match x {
|
||||||
|
VecWrapper::A(v) if { drop(v); false } => 1,
|
||||||
|
//~^ ERROR cannot move out of borrowed content
|
||||||
|
VecWrapper::A(v) => v.len()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
foo(VecWrapper::A(vec![107]));
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0507]: cannot move out of borrowed content
|
||||||
|
--> $DIR/rfc-reject-double-move-across-arms.rs:8:36
|
||||||
|
|
|
||||||
|
LL | VecWrapper::A(v) if { drop(v); false } => 1,
|
||||||
|
| ^ cannot move out of borrowed content
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0507`.
|
|
@ -0,0 +1,17 @@
|
||||||
|
#![feature(nll)]
|
||||||
|
#![feature(bind_by_move_pattern_guards)]
|
||||||
|
|
||||||
|
struct A { a: Box<i32> }
|
||||||
|
|
||||||
|
fn foo(n: i32) {
|
||||||
|
let x = A { a: Box::new(n) };
|
||||||
|
let _y = match x {
|
||||||
|
A { a: v } if { drop(v); true } => v,
|
||||||
|
//~^ ERROR cannot move out of borrowed content
|
||||||
|
_ => Box::new(0),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
foo(107);
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0507]: cannot move out of borrowed content
|
||||||
|
--> $DIR/rfc-reject-double-move-in-first-arm.rs:9:30
|
||||||
|
|
|
||||||
|
LL | A { a: v } if { drop(v); true } => v,
|
||||||
|
| ^ cannot move out of borrowed content
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0507`.
|
Loading…
Add table
Add a link
Reference in a new issue