Skip to content

Is proc-macro-attribute application order defined? #692

Open
@CAD97

Description

@CAD97

In code, if I write

#[strip_attrs_on_item]
#[this_attr_always_panics]
struct Foo;

Is it guaranteed that strip_attrs_on_item will receive the token stream # [ this_attr_always_panics ] struct Foo ; and that if it does what it says on the tin and emits struct Foo ;, this_attr_always_panics is not called?

As an addendum, is this_attr_always_panics even resolved, if it's transformed before application?

#565 is probably related. rust-lang/rust#63336 is this issue.

derive macros have a special path to say "I handle this attribute" so derive(serde::Serialize) implies that you can use #[serde(..)] afterwards, and the derive gives it meaning. If expansion order isn't guaranteed outer before inner, then replacing the derive with an attribute would remove this ability.

This is not #578, which is about attributes within the same crate but on different items.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions