Skip to content

Commit c50884c

Browse files
committed
Tests for feature(bind_by_move_pattern_guards).
Apparently copyright notices are no longer necessary apparently. (See #43498 and #53654.)
1 parent 7d844e8 commit c50884c

14 files changed

+208
-11
lines changed

src/test/ui/bind-by-move/bind-by-move-no-guards.rs

-10
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,3 @@
1-
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
2-
// file at the top-level directory of this distribution and at
3-
// http://rust-lang.org/COPYRIGHT.
4-
//
5-
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6-
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7-
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8-
// option. This file may not be copied, modified, or distributed
9-
// except according to those terms.
10-
111
use std::sync::mpsc::channel;
122

133
fn main() {

src/test/ui/bind-by-move/bind-by-move-no-guards.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error[E0008]: cannot bind by-move into a pattern guard
2-
--> $DIR/bind-by-move-no-guards.rs:18:14
2+
--> $DIR/bind-by-move-no-guards.rs:8:14
33
|
44
LL | Some(z) if z.recv().unwrap() => { panic!() },
55
| ^ moves value into pattern guard
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Adaptation of existing ui test (from way back in
2+
// rust-lang/rust#2329), that starts passing with this feature in
3+
// place.
4+
5+
// compile-pass
6+
7+
#![feature(nll)]
8+
#![feature(bind_by_move_pattern_guards)]
9+
10+
use std::sync::mpsc::channel;
11+
12+
fn main() {
13+
let (tx, rx) = channel();
14+
let x = Some(rx);
15+
tx.send(false);
16+
match x {
17+
Some(z) if z.recv().unwrap() => { panic!() },
18+
Some(z) => { assert!(!z.recv().unwrap()); },
19+
None => panic!()
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
error[E0008]: cannot bind by-move into a pattern guard
2+
--> $DIR/feature-gate.rs:33:16
3+
|
4+
LL | A { a: v } if *v == 42 => v,
5+
| ^ moves value into pattern guard
6+
7+
error: aborting due to previous error
8+
9+
For more information about this error, try `rustc --explain E0008`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
error: compilation successful
2+
--> $DIR/feature-gate.rs:42:1
3+
|
4+
LL | / fn main() {
5+
LL | | foo(107)
6+
LL | | }
7+
| |_^
8+
9+
error: aborting due to previous error
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
error: compilation successful
2+
--> $DIR/feature-gate.rs:42:1
3+
|
4+
LL | / fn main() {
5+
LL | | foo(107)
6+
LL | | }
7+
| |_^
8+
9+
error: aborting due to previous error
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
error: compilation successful
2+
--> $DIR/feature-gate.rs:42:1
3+
|
4+
LL | / fn main() {
5+
LL | | foo(107)
6+
LL | | }
7+
| |_^
8+
9+
error: aborting due to previous error
10+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
error[E0008]: cannot bind by-move into a pattern guard
2+
--> $DIR/feature-gate.rs:33:16
3+
|
4+
LL | A { a: v } if *v == 42 => v,
5+
| ^ moves value into pattern guard
6+
7+
error: aborting due to previous error
8+
9+
For more information about this error, try `rustc --explain E0008`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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.)
6+
7+
// gate-test-bind_by_move_pattern_guards
8+
9+
// revisions: no_gate gate_and_2015 gate_and_2018 gate_and_znll gate_and_feature_nll
10+
11+
// (We're already testing NLL behavior quite explicitly, no need for compare-mode=nll.)
12+
// ignore-compare-mode-nll
13+
14+
#![feature(rustc_attrs)]
15+
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))]
20+
21+
#![cfg_attr(gate_and_feature_nll, feature(nll))]
22+
23+
//[gate_and_2015] edition:2015
24+
//[gate_and_2018] edition:2018
25+
//[gate_and_znll] compile-flags: -Z borrowck=mir
26+
27+
struct A { a: Box<i32> }
28+
29+
fn foo(n: i32) {
30+
let x = A { a: Box::new(n) };
31+
let _y = match x {
32+
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
36+
37+
_ => Box::new(0)
38+
};
39+
}
40+
41+
#[rustc_error]
42+
fn main() {
43+
foo(107)
44+
}
45+
//[gate_and_2018]~^^^ ERROR compilation successful
46+
//[gate_and_znll]~^^^^ ERROR compilation successful
47+
//[gate_and_feature_nll]~^^^^^ ERROR compilation successful
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#![feature(nll)]
2+
#![feature(bind_by_move_pattern_guards)]
3+
4+
// compile-pass
5+
6+
struct A { a: Box<i32> }
7+
8+
impl A {
9+
fn get(&self) -> i32 { *self.a }
10+
}
11+
12+
fn foo(n: i32) {
13+
let x = A { a: Box::new(n) };
14+
let y = match x {
15+
A { a: v } if *v == 42 => v,
16+
_ => Box::new(0),
17+
};
18+
}
19+
20+
fn bar(n: i32) {
21+
let x = A { a: Box::new(n) };
22+
let y = match x {
23+
A { a: v } if x.get() == 42 => v,
24+
_ => Box::new(0),
25+
};
26+
}
27+
28+
fn baz(n: i32) {
29+
let x = A { a: Box::new(n) };
30+
let y = match x {
31+
A { a: v } if *v.clone() == 42 => v,
32+
_ => Box::new(0),
33+
};
34+
}
35+
36+
fn main() {
37+
foo(107);
38+
bar(107);
39+
baz(107);
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#![feature(nll)]
2+
#![feature(bind_by_move_pattern_guards)]
3+
4+
enum VecWrapper { A(Vec<i32>) }
5+
6+
fn foo(x: VecWrapper) -> usize {
7+
match x {
8+
VecWrapper::A(v) if { drop(v); false } => 1,
9+
//~^ ERROR cannot move out of borrowed content
10+
VecWrapper::A(v) => v.len()
11+
}
12+
}
13+
14+
fn main() {
15+
foo(VecWrapper::A(vec![107]));
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
error[E0507]: cannot move out of borrowed content
2+
--> $DIR/rfc-reject-double-move-across-arms.rs:8:36
3+
|
4+
LL | VecWrapper::A(v) if { drop(v); false } => 1,
5+
| ^ cannot move out of borrowed content
6+
7+
error: aborting due to previous error
8+
9+
For more information about this error, try `rustc --explain E0507`.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#![feature(nll)]
2+
#![feature(bind_by_move_pattern_guards)]
3+
4+
struct A { a: Box<i32> }
5+
6+
fn foo(n: i32) {
7+
let x = A { a: Box::new(n) };
8+
let _y = match x {
9+
A { a: v } if { drop(v); true } => v,
10+
//~^ ERROR cannot move out of borrowed content
11+
_ => Box::new(0),
12+
};
13+
}
14+
15+
fn main() {
16+
foo(107);
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
error[E0507]: cannot move out of borrowed content
2+
--> $DIR/rfc-reject-double-move-in-first-arm.rs:9:30
3+
|
4+
LL | A { a: v } if { drop(v); true } => v,
5+
| ^ cannot move out of borrowed content
6+
7+
error: aborting due to previous error
8+
9+
For more information about this error, try `rustc --explain E0507`.

0 commit comments

Comments
 (0)