9249e6a1e2
Changes #[derive(Copy, Clone)] to use a faster impl of Clone when both derives are present, and there are no generics in the type. The faster impl is simply returning *self (which works because the type is also Copy). See the comments in libsyntax_ext/deriving/clone.rs for more details. There are a few types which are Copy but not Clone, in violation of the definition of Copy. These include large arrays and tuples. The very existence of these types is arguably a bug, but in order for this optimization not to change the applicability of #[derive(Copy, Clone)], the faster Clone impl also injects calls to a new function, core::clone::assert_receiver_is_clone, to verify that all members are actually Clone. This is not a breaking change, because pursuant to RFC 1521, any type that implements Copy should not do any observable work in its Clone impl.
28 lines
805 B
Rust
28 lines
805 B
Rust
// 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)
|
|
|
|
#[derive(Copy, Clone)]
|
|
struct C { _x: u8 }
|
|
|
|
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]
|
|
}
|