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.
34 lines
1.0 KiB
Rust
34 lines
1.0 KiB
Rust
// 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.
|
|
|
|
#![allow(unknown_features)]
|
|
#![feature(box_syntax)]
|
|
|
|
#[derive(Copy, Clone)]
|
|
enum side { mayo, catsup, vinegar }
|
|
#[derive(Copy, Clone)]
|
|
enum order { hamburger, fries(side), shake }
|
|
#[derive(Copy, Clone)]
|
|
enum meal { to_go(order), for_here(order) }
|
|
|
|
fn foo(m: Box<meal>, cond: bool) {
|
|
match *m {
|
|
meal::to_go(_) => { }
|
|
meal::for_here(_) if cond => {}
|
|
meal::for_here(order::hamburger) => {}
|
|
meal::for_here(order::fries(_s)) => {}
|
|
meal::for_here(order::shake) => {}
|
|
}
|
|
}
|
|
|
|
pub fn main() {
|
|
foo(box meal::for_here(order::hamburger), true)
|
|
}
|