auto trait
in favor of #[rustc_auto_trait]
Auto traits are no longer intended to be stabilized and made available to the general public[1].
They should remain solely an implementation detail of blessed libraries like core
and std
.
To reflect this new status of auto traits, I hereby propose to remove the syntax auto trait
alongside the feature auto_traits
it is gated behind and to introduce the attribute #[rustc_auto_trait]
as part of the internal feature rustc_attrs
.
It sends the wrong signals to have custom syntax for this, for all intents and purposes, internal feature. It may mislead end users to believe that auto traits will eventually be stabilized which is unlikely.
An internal attribute with an off-putting name like rustc_auto_trait
should slowly steer users away from this feature. People who currently make use of auto traits in their projects will hopefully think twice about opting into rustc_attrs
in order to continue using auto traits when they migrate to the latest nightly compiler and regard it only as a short-term solution if they do end up keeping their auto traits around.
Regarding the motivation to not stabilize the feature for others to use freely, I can't speak for T-lang but I can list the biggest pitfalls of auto traits. See Pitfalls of Auto Traits.
Lastly, it allows us to simplify the HIR.
cfg
'ed out auto trait
s successfully compile on stable as auto_traits
uses a post-expansion feature gate due to historical reasons. Unfortunately, this is not a hypothetical, stable users of leptos-rs/leptos and Pyo3/pyo3 would be affected.auto trait
for now and to reject it after macro expansion which would solve this in the meantime. See Steps.cfg
'ed out: #[cfg(FALSE)] impl Trait for .. {}
which could be a warning to us.Send
, Sync
, Unpin
, UnwindSafe
and RefUnwindSafe
may feel more “special” and more “exotic”.auto_traits
as internal. This would lead to less churn in the ecosystem but it might not send a strong enough message to users already depending on auto traits (contrary to first-time users) since it's easier to silence the warning than to address it properly.auto trait
after macro expansion but continue to parse it which is necessary for bootstrapping. Introduce #[rustc_auto_trait]
behind the rustc_attrs
feature and remove the auto_traits
feature.auto trait
before macro expansion to successfully lint against cfg
'ed out auto trait
s etc.It's always possible to move the status of the feature from internal back to experimental and change the attribute from #[rustc_auto_trait]
to #[auto_trait]
. We can also reintroduce the syntax auto trait
. However, it's unclear how the macro fragment specifier item
can then be updated without breaking backward compatibility. Generally, macro fragment specifiers are not forward compatible (see inline_const
for example) which needs be solved at some point.
assert_impls_auto_trait!(Ty, Tr0, Tr1, …)
helper macros available on crates.io to ensure that they don't introduce regressions.auto_traits
was stabilized, it would be plain out impossible to do anything remotely similar since downstream users could define arbitrary amounts of auto traits together with negative implementations which the upstream user has not the slightest clue about.nightly
.Ungil
behind the Cargo feature flag nightly
to ensure memory safety.There might be many more since the ones above are merely from the first few pages of the search results (GitHub Advanced Search / Code Search).