Add tests of move-out-of-array restriction.
This commit is contained in:
parent
cc8f35f874
commit
ce341f79b4
28
src/test/compile-fail/move-out-of-array-1.rs
Normal file
28
src/test/compile-fail/move-out-of-array-1.rs
Normal file
@ -0,0 +1,28 @@
|
||||
// Copyright 2015 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.
|
||||
|
||||
// Ensure that we cannot move out of a fixed-size array (especially
|
||||
// when the element type has a destructor).
|
||||
|
||||
|
||||
struct D { _x: u8 }
|
||||
|
||||
impl Drop for D { fn drop(&mut self) { } }
|
||||
|
||||
fn main() {
|
||||
fn d() -> D { D { _x: 0 } }
|
||||
|
||||
let _d1 = foo([d(), d(), d(), d()], 1);
|
||||
let _d3 = foo([d(), d(), d(), d()], 3);
|
||||
}
|
||||
|
||||
fn foo(a: [D; 4], i: usize) -> D {
|
||||
a[i] //~ ERROR cannot move out of type `[D; 4]`
|
||||
}
|
28
src/test/run-pass/copy-out-of-array-1.rs
Normal file
28
src/test/run-pass/copy-out-of-array-1.rs
Normal file
@ -0,0 +1,28 @@
|
||||
// Copyright 2015 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.
|
||||
|
||||
// Ensure that we can copy out of a fixed-size array.
|
||||
//
|
||||
// (Compare with compile-fail/move-out-of-array-1.rs)
|
||||
|
||||
struct C { _x: u8 }
|
||||
|
||||
impl Copy for C { }
|
||||
|
||||
fn main() {
|
||||
fn d() -> C { C { _x: 0 } }
|
||||
|
||||
let _d1 = foo([d(), d(), d(), d()], 1);
|
||||
let _d3 = foo([d(), d(), d(), d()], 3);
|
||||
}
|
||||
|
||||
fn foo(a: [C; 4], i: usize) -> C {
|
||||
a[i]
|
||||
}
|
35
src/test/run-pass/destructure-array-1.rs
Normal file
35
src/test/run-pass/destructure-array-1.rs
Normal file
@ -0,0 +1,35 @@
|
||||
// Copyright 2015 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.
|
||||
|
||||
// Ensure that we can do a destructuring bind of a fixed-size array,
|
||||
// even when the element type has a destructor.
|
||||
|
||||
struct D { x: u8 }
|
||||
|
||||
impl Drop for D { fn drop(&mut self) { } }
|
||||
|
||||
fn main() {
|
||||
fn d(x: u8) -> D { D { x: x } }
|
||||
|
||||
let d1 = foo([d(1), d(2), d(3), d(4)], 1);
|
||||
let d3 = foo([d(5), d(6), d(7), d(8)], 3);
|
||||
assert_eq!(d1.x, 2);
|
||||
assert_eq!(d3.x, 8);
|
||||
}
|
||||
|
||||
fn foo([a, b, c, d]: [D; 4], i: usize) -> D {
|
||||
match i {
|
||||
0 => a,
|
||||
1 => b,
|
||||
2 => c,
|
||||
3 => d,
|
||||
_ => panic!("unmatched"),
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user