Don’t sure whether it’s still actual, but…
Personally I think, that new keyword is almost always a poor idea.
The way I see it, all syntax richness may be split into two parts: declarations and annotations. Declarations work on the very same semantic level that programmer uses when thinking about the problem. For example, fn, trait, mod declare things, they all have very explicit and distinct meaning within the language.
On the other hand, annotations actually are meta information that affect how compiler interprets the code. They’re not a part of the code itself. We may say, that annotations declare ideas, not things. Actual things arise later, when compiler (or human) interprets that ideas.
All of the following annotations are not the code, they are comments to the interpreter:
#[derive(Debug)]
#[inline]
#[cfg(test)]
#[test]
A rule of thumb is that after interpretation of the syntax, all annotations may be removed, and it would not cause any problem, because during interpretation phase we’ve already introduced all things, like auto-generated methods, provided trait impls for auto traits and removed unnecessary ones (in case of test or cfg).
Following this logic we may say, that auto trait is also an idea, not a thing. Therefore, it should be introduced on a lexical level as annotation:
#[auto_trait]
trait Foo {}