| r[attributes.derive] |
| # Derive |
| |
| r[attributes.derive.intro] |
| The *`derive` [attribute][attributes]* invokes one or more [derive macros], allowing new [items] to be automatically generated for data structures. You can create `derive` macros with [procedural macros]. |
| |
| > [!EXAMPLE] |
| > The [`PartialEq`][macro@PartialEq] derive macro emits an [implementation] of [`PartialEq`] for `Foo<T> where T: PartialEq`. The [`Clone`][macro@Clone] derive macro does likewise for [`Clone`]. |
| > |
| > ```rust |
| > #[derive(PartialEq, Clone)] |
| > struct Foo<T> { |
| > a: i32, |
| > b: T, |
| > } |
| > ``` |
| > |
| > The generated `impl` items are equivalent to: |
| > |
| > ```rust |
| > # struct Foo<T> { a: i32, b: T } |
| > impl<T: PartialEq> PartialEq for Foo<T> { |
| > fn eq(&self, other: &Foo<T>) -> bool { |
| > self.a == other.a && self.b == other.b |
| > } |
| > } |
| > |
| > impl<T: Clone> Clone for Foo<T> { |
| > fn clone(&self) -> Self { |
| > Foo { a: self.a.clone(), b: self.b.clone() } |
| > } |
| > } |
| > ``` |
| |
| r[attributes.derive.syntax] |
| The `derive` attribute uses the [MetaListPaths] syntax to specify a list of paths to [derive macros] to invoke. |
| |
| r[attributes.derive.allowed-positions] |
| The `derive` attribute may be applied to [structs][items.struct], [enums][items.enum], and [unions][items.union]. |
| |
| r[attributes.derive.duplicates] |
| The `derive` attribute may be specified multiple times on an item, with all derive macros listed in all attributes being invoked. |
| |
| r[attributes.derive.stdlib] |
| The `derive` attribute is exported in the standard library prelude as [`core::prelude::v1::derive`]. |
| |
| r[attributes.derive.built-in] |
| Built-in derives are defined in the [language prelude][names.preludes.lang]. The list of built-in derives are: |
| |
| - [`Clone`] |
| - [`Copy`] |
| - [`Debug`] |
| - [`Default`] |
| - [`Eq`] |
| - [`Hash`] |
| - [`Ord`] |
| - [`PartialEq`] |
| - [`PartialOrd`] |
| |
| r[attributes.derive.built-in-automatically_derived] |
| The built-in derives include the [`automatically_derived` attribute][attributes.derive.automatically_derived] on the implementations they generate. |
| |
| r[attributes.derive.behavior] |
| During macro expansion, for each element in the list of derives, the corresponding derive macro expands to zero or more [items]. |
| |
| r[attributes.derive.automatically_derived] |
| ## The `automatically_derived` attribute |
| |
| r[attributes.derive.automatically_derived.intro] |
| The *`automatically_derived` [attribute][attributes]* is used to annotate an [implementation] to indicate that it was automatically created by a [derive macro]. It has no direct effect, but it may be used by tools and diagnostic lints to detect these automatically generated implementations. |
| |
| > [!EXAMPLE] |
| > Given [`#[derive(Clone)]`][macro@Clone] on `struct Example`, the [derive macro] may produce: |
| > |
| > ```rust |
| > # struct Example; |
| > #[automatically_derived] |
| > impl ::core::clone::Clone for Example { |
| > #[inline] |
| > fn clone(&self) -> Self { |
| > Example |
| > } |
| > } |
| > ``` |
| |
| r[attributes.derive.automatically_derived.syntax] |
| The `automatically_derived` attribute uses the [MetaWord] syntax and so does not accept any arguments. |
| |
| r[attributes.derive.automatically_derived.allowed-positions] |
| The `automatically_derived` attribute may be placed on an [implementation]. |
| |
| > [!NOTE] |
| > `rustc` currently accepts the attribute in other positions but lints against it. |
| |
| r[attributes.derive.automatically_derived.duplicates] |
| Duplicate instances of the `automatically_derived` attribute on the same implementation have no effect. |
| |
| > [!NOTE] |
| > `rustc` lints against duplicate use of this attribute on uses following the first. |
| |
| r[attributes.derive.automatically_derived.behavior] |
| The `automatically_derived` attribute has no behavior. |
| |
| [items]: ../items.md |
| [derive macro]: macro.proc.derive |
| [derive macros]: macro.proc.derive |
| [implementation]: ../items/implementations.md |
| [items]: ../items.md |
| [procedural macros]: macro.proc.derive |