Skip to content

Commit e4e765b

Browse files
committed
add a TrivialClone implementation when deriving both Clone and Copy
1 parent 5fb5861 commit e4e765b

File tree

17 files changed

+82
-16
lines changed

17 files changed

+82
-16
lines changed

compiler/rustc_builtin_macros/src/deriving/bounds.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use rustc_ast::MetaItem;
1+
use rustc_ast::{MetaItem, Safety};
22
use rustc_expand::base::{Annotatable, ExtCtxt};
33
use rustc_span::Span;
44

@@ -24,6 +24,7 @@ pub(crate) fn expand_deriving_copy(
2424
associated_types: Vec::new(),
2525
is_const,
2626
is_staged_api_crate: cx.ecfg.features.staged_api(),
27+
safety: Safety::Default,
2728
};
2829

2930
trait_def.expand(cx, mitem, item, push);
@@ -48,6 +49,7 @@ pub(crate) fn expand_deriving_const_param_ty(
4849
associated_types: Vec::new(),
4950
is_const,
5051
is_staged_api_crate: cx.ecfg.features.staged_api(),
52+
safety: Safety::Default,
5153
};
5254

5355
trait_def.expand(cx, mitem, item, push);

compiler/rustc_builtin_macros/src/deriving/clone.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use rustc_ast::{self as ast, Generics, ItemKind, MetaItem, VariantData};
1+
use rustc_ast::{self as ast, Generics, ItemKind, MetaItem, Safety, VariantData};
22
use rustc_data_structures::fx::FxHashSet;
33
use rustc_expand::base::{Annotatable, ExtCtxt};
4-
use rustc_span::{Ident, Span, kw, sym};
4+
use rustc_span::{DUMMY_SP, Ident, Span, kw, sym};
55
use thin_vec::{ThinVec, thin_vec};
66

77
use crate::deriving::generic::ty::*;
@@ -68,6 +68,26 @@ pub(crate) fn expand_deriving_clone(
6868
_ => cx.dcx().span_bug(span, "`#[derive(Clone)]` on trait item or impl item"),
6969
}
7070

71+
// If the clone method is just copying the value, also mark the type as
72+
// `TrivialClone` to allow some library optimizations.
73+
if is_simple {
74+
let trivial_def = TraitDef {
75+
span,
76+
path: path_std!(clone::TrivialClone),
77+
skip_path_as_bound: false,
78+
needs_copy_as_bound_if_packed: true,
79+
additional_bounds: bounds.clone(),
80+
supports_unions: true,
81+
methods: Vec::new(),
82+
associated_types: Vec::new(),
83+
is_const,
84+
is_staged_api_crate: cx.ecfg.features.staged_api(),
85+
safety: Safety::Unsafe(DUMMY_SP),
86+
};
87+
88+
trivial_def.expand_ext(cx, mitem, item, push, true);
89+
}
90+
7191
let trait_def = TraitDef {
7292
span,
7393
path: path_std!(clone::Clone),
@@ -88,6 +108,7 @@ pub(crate) fn expand_deriving_clone(
88108
associated_types: Vec::new(),
89109
is_const,
90110
is_staged_api_crate: cx.ecfg.features.staged_api(),
111+
safety: Safety::Default,
91112
};
92113

93114
trait_def.expand_ext(cx, mitem, item, push, is_simple)

compiler/rustc_builtin_macros/src/deriving/cmp/eq.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use rustc_ast::{self as ast, MetaItem};
1+
use rustc_ast::{self as ast, MetaItem, Safety};
22
use rustc_data_structures::fx::FxHashSet;
33
use rustc_expand::base::{Annotatable, ExtCtxt};
44
use rustc_span::{Span, sym};
@@ -44,6 +44,7 @@ pub(crate) fn expand_deriving_eq(
4444
associated_types: Vec::new(),
4545
is_const,
4646
is_staged_api_crate: cx.ecfg.features.staged_api(),
47+
safety: Safety::Default,
4748
};
4849
trait_def.expand_ext(cx, mitem, item, push, true)
4950
}

compiler/rustc_builtin_macros/src/deriving/cmp/ord.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use rustc_ast::MetaItem;
1+
use rustc_ast::{MetaItem, Safety};
22
use rustc_expand::base::{Annotatable, ExtCtxt};
33
use rustc_span::{Ident, Span, sym};
44
use thin_vec::thin_vec;
@@ -35,6 +35,7 @@ pub(crate) fn expand_deriving_ord(
3535
associated_types: Vec::new(),
3636
is_const,
3737
is_staged_api_crate: cx.ecfg.features.staged_api(),
38+
safety: Safety::Default,
3839
};
3940

4041
trait_def.expand(cx, mitem, item, push)

compiler/rustc_builtin_macros/src/deriving/cmp/partial_eq.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use rustc_ast::{BinOpKind, BorrowKind, Expr, ExprKind, MetaItem, Mutability};
1+
use rustc_ast::{BinOpKind, BorrowKind, Expr, ExprKind, MetaItem, Mutability, Safety};
22
use rustc_expand::base::{Annotatable, ExtCtxt};
33
use rustc_span::{Span, sym};
44
use thin_vec::thin_vec;
@@ -30,6 +30,7 @@ pub(crate) fn expand_deriving_partial_eq(
3030
associated_types: Vec::new(),
3131
is_const: false,
3232
is_staged_api_crate: cx.ecfg.features.staged_api(),
33+
safety: Safety::Default,
3334
};
3435
structural_trait_def.expand(cx, mitem, item, push);
3536

@@ -59,6 +60,7 @@ pub(crate) fn expand_deriving_partial_eq(
5960
associated_types: Vec::new(),
6061
is_const,
6162
is_staged_api_crate: cx.ecfg.features.staged_api(),
63+
safety: Safety::Default,
6264
};
6365
trait_def.expand(cx, mitem, item, push)
6466
}

compiler/rustc_builtin_macros/src/deriving/cmp/partial_ord.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use rustc_ast::{ExprKind, ItemKind, MetaItem, PatKind};
1+
use rustc_ast::{ExprKind, ItemKind, MetaItem, PatKind, Safety};
22
use rustc_expand::base::{Annotatable, ExtCtxt};
33
use rustc_span::{Ident, Span, sym};
44
use thin_vec::thin_vec;
@@ -65,6 +65,7 @@ pub(crate) fn expand_deriving_partial_ord(
6565
associated_types: Vec::new(),
6666
is_const,
6767
is_staged_api_crate: cx.ecfg.features.staged_api(),
68+
safety: Safety::Default,
6869
};
6970
trait_def.expand(cx, mitem, item, push)
7071
}

compiler/rustc_builtin_macros/src/deriving/debug.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use rustc_ast::{self as ast, EnumDef, MetaItem};
1+
use rustc_ast::{self as ast, EnumDef, MetaItem, Safety};
22
use rustc_expand::base::{Annotatable, ExtCtxt};
33
use rustc_session::config::FmtDebug;
44
use rustc_span::{Ident, Span, Symbol, sym};
@@ -42,6 +42,7 @@ pub(crate) fn expand_deriving_debug(
4242
associated_types: Vec::new(),
4343
is_const,
4444
is_staged_api_crate: cx.ecfg.features.staged_api(),
45+
safety: Safety::Default,
4546
};
4647
trait_def.expand(cx, mitem, item, push)
4748
}

compiler/rustc_builtin_macros/src/deriving/default.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use core::ops::ControlFlow;
22

3-
use rustc_ast as ast;
43
use rustc_ast::visit::visit_opt;
5-
use rustc_ast::{EnumDef, VariantData, attr};
4+
use rustc_ast::{self as ast, EnumDef, Safety, VariantData, attr};
65
use rustc_expand::base::{Annotatable, DummyResult, ExtCtxt};
76
use rustc_span::{ErrorGuaranteed, Ident, Span, kw, sym};
87
use smallvec::SmallVec;
@@ -52,6 +51,7 @@ pub(crate) fn expand_deriving_default(
5251
associated_types: Vec::new(),
5352
is_const,
5453
is_staged_api_crate: cx.ecfg.features.staged_api(),
54+
safety: Safety::Default,
5555
};
5656
trait_def.expand(cx, mitem, item, push)
5757
}

compiler/rustc_builtin_macros/src/deriving/from.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use rustc_ast as ast;
2-
use rustc_ast::{ItemKind, VariantData};
2+
use rustc_ast::{ItemKind, Safety, VariantData};
33
use rustc_errors::MultiSpan;
44
use rustc_expand::base::{Annotatable, DummyResult, ExtCtxt};
55
use rustc_span::{Ident, Span, kw, sym};
@@ -127,6 +127,7 @@ pub(crate) fn expand_deriving_from(
127127
associated_types: Vec::new(),
128128
is_const,
129129
is_staged_api_crate: cx.ecfg.features.staged_api(),
130+
safety: Safety::Default,
130131
};
131132

132133
from_trait_def.expand(cx, mitem, annotatable, push);

compiler/rustc_builtin_macros/src/deriving/generic/mod.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,9 @@ pub(crate) struct TraitDef<'a> {
225225
pub is_const: bool,
226226

227227
pub is_staged_api_crate: bool,
228+
229+
/// The safety of the `impl`.
230+
pub safety: Safety,
228231
}
229232

230233
pub(crate) struct MethodDef<'a> {
@@ -832,7 +835,7 @@ impl<'a> TraitDef<'a> {
832835
ast::ItemKind::Impl(ast::Impl {
833836
generics: trait_generics,
834837
of_trait: Some(Box::new(ast::TraitImplHeader {
835-
safety: ast::Safety::Default,
838+
safety: self.safety,
836839
polarity: ast::ImplPolarity::Positive,
837840
defaultness: ast::Defaultness::Final,
838841
constness: if self.is_const {

0 commit comments

Comments
 (0)