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.
33 lines
1 KiB
Rust
33 lines
1 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)
|
|
}
|