rustc_builtin_macros/deriving/
bounds.rs1use rustc_ast::MetaItem;
2use rustc_expand::base::{Annotatable, ExtCtxt};
3use rustc_span::Span;
4
5use crate::deriving::generic::*;
6use crate::deriving::path_std;
7
8pub(crate) fn expand_deriving_copy(
9 cx: &ExtCtxt<'_>,
10 span: Span,
11 mitem: &MetaItem,
12 item: &Annotatable,
13 push: &mut dyn FnMut(Annotatable),
14 is_const: bool,
15) {
16 let trait_def = TraitDef {
17 span,
18 path: path_std!(marker::Copy),
19 skip_path_as_bound: false,
20 needs_copy_as_bound_if_packed: false,
21 additional_bounds: Vec::new(),
22 supports_unions: true,
23 methods: Vec::new(),
24 associated_types: Vec::new(),
25 is_const,
26 is_staged_api_crate: cx.ecfg.features.staged_api(),
27 };
28
29 trait_def.expand(cx, mitem, item, push);
30}
31
32pub(crate) fn expand_deriving_const_param_ty(
33 cx: &ExtCtxt<'_>,
34 span: Span,
35 mitem: &MetaItem,
36 item: &Annotatable,
37 push: &mut dyn FnMut(Annotatable),
38 is_const: bool,
39) {
40 let trait_def = TraitDef {
41 span,
42 path: path_std!(marker::ConstParamTy_),
43 skip_path_as_bound: false,
44 needs_copy_as_bound_if_packed: false,
45 additional_bounds: vec![ty::Ty::Path(path_std!(cmp::Eq))],
46 supports_unions: false,
47 methods: Vec::new(),
48 associated_types: Vec::new(),
49 is_const,
50 is_staged_api_crate: cx.ecfg.features.staged_api(),
51 };
52
53 trait_def.expand(cx, mitem, item, push);
54
55 let trait_def = TraitDef {
56 span,
57 path: path_std!(marker::UnsizedConstParamTy),
58 skip_path_as_bound: false,
59 needs_copy_as_bound_if_packed: false,
60 additional_bounds: vec![ty::Ty::Path(path_std!(cmp::Eq))],
61 supports_unions: false,
62 methods: Vec::new(),
63 associated_types: Vec::new(),
64 is_const,
65 is_staged_api_crate: cx.ecfg.features.staged_api(),
66 };
67
68 trait_def.expand(cx, mitem, item, push);
69}
70
71pub(crate) fn expand_deriving_unsized_const_param_ty(
72 cx: &ExtCtxt<'_>,
73 span: Span,
74 mitem: &MetaItem,
75 item: &Annotatable,
76 push: &mut dyn FnMut(Annotatable),
77 is_const: bool,
78) {
79 let trait_def = TraitDef {
80 span,
81 path: path_std!(marker::UnsizedConstParamTy),
82 skip_path_as_bound: false,
83 needs_copy_as_bound_if_packed: false,
84 additional_bounds: vec![ty::Ty::Path(path_std!(cmp::Eq))],
85 supports_unions: false,
86 methods: Vec::new(),
87 associated_types: Vec::new(),
88 is_const,
89 is_staged_api_crate: cx.ecfg.features.staged_api(),
90 };
91
92 trait_def.expand(cx, mitem, item, push);
93}