Built-in attributes are treated differently vs prelude attributes, unstable built-in attributes can name-collide with stable macro, and built-in attributes can break back-compat
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 119k
- Forks
- 16.1k
- PR merge metrics
- PR metrics pending
Description
Example breakage: Broken build after updating: coverage is ambiguous; ambiguous because of a name conflict with a builtin attribute
Example code:
macro_rules! coverage {
() => {
/* .. */
};
}
pub(crate) use coverage; // `use` here becomes ambiguous
testis similar to a proc-macro, which is exposed via the prelude. It is not a "built-in" attribute.The reference hasn't really been updated from when that changed. The sub-namespace section also probably should be clearer on what it means to shadow. I also don't have a good explanation why a prelude attribute is treated differently from a built-in one.
Originally posted by @ehuss in #121157
This is an interesting problem that has three aspects:
- (T-compiler) Built-in attributes like
#[coverage(..)]are handled differently versus prelude attributes like#[test], including name resolution. - (T-compiler) Current feature-gating of unstable built-in attributes is insufficient: adding a new unstable built-in attribute gated behind a feature gate (e.g.
#[coverage]) can still break stable code without any feature gates (e.g.useof a user-defined macro of the same name as the newly added built-in attribute). - (T-compiler, T-lang) Stabilization of a built-in attribute can break backwards compatibility: old code can be broken by addition of a new built-in attribute.
It might be tricky to change (or not possible), mostly opened this issue for awareness.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reading this issue and the linked #121157 report, including the coverage macro example and the discussion of test as a prelude attribute. Trace how built-in and prelude attributes differ in name resolution and feature gating; done requires a decided, compatible behavior covering unstable additions, stabilization, and the reference wording.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100