Skip to content

Commit 83c8e28

Browse files
committed
Document internal specialization attributes
1 parent 4422a5c commit 83c8e28

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/code-considerations/using-unstable-lang/specialization.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,39 @@ impl<T: Copy> RcFromSlice<T> for Rc<[T]> {
5858

5959
Only specialization using the `min_specialization` feature should be used. The full `specialization` feature is known to be unsound.
6060

61+
## Specialization attributes
62+
63+
There are two unstable attributes that can be used to allow a trait bound in a specializing implementation that does not appear in the default implementation.
64+
65+
`rustc_specialization_trait` restricts the implementations of a trait to be "always applicable". Implementing traits annotated with `rustc_specialization_trait` is unstable, so this should not be used on any stable traits exported from the standard library. `Sized` is an exception, and can have this attribute because it already cannot be implemented by an `impl` block.
66+
67+
`rustc_unsafe_specialization_marker` allows specializing on a trait with no associated items. The attribute is `unsafe` because lifetime constraints from the implementations of the trait are not considered when specializing. In the following example, the specialized implementation is used for *all* shared reference types, not just those with `'static` lifetime.
68+
69+
```rust,ignore
70+
#[rustc_unsafe_specialization_marker]
71+
trait StaticRef {}
72+
73+
impl<T> StaticRef for &'static T {}
74+
75+
trait DoThing: Sized {
76+
fn do_thing(self);
77+
}
78+
79+
impl<T> DoThing for T {
80+
default fn do_thing(self) {
81+
// slow impl
82+
}
83+
}
84+
85+
impl<T: StaticRef> DoThing for T {
86+
fn do_thing(self) {
87+
// fast impl
88+
}
89+
}
90+
```
91+
92+
`rustc_unsafe_specialization_marker` exists to allow existing specializations that are based on marker traits exported from `std`, such as `Copy`, `FusedIterator` or `Eq`. New uses of `rustc_unsafe_specialization_marker` should be avoided.
93+
6194
## For reviewers
6295

6396
Look out for any `default` annotations on public trait implementations. These will need to be refactored into a private dispatch trait. Also look out for uses of specialization that do more than pick a more optimized implementation.

0 commit comments

Comments
 (0)