Skip to content

Tracking issue for migrating all remaining post-expansion feature gates to pre-expansion ones #154045

@fmease

Description

@fmease

Tip

If you've arrived here because you encountered a feature gate warning for unstable syntax behind #[cfg(…)], here's how to you can transform your code while keeping the unstable syntax cfg-conditional:

Before (triggers a feature gate warning):

#[cfg(feature = "nightly")] // or a different cfg-condition
impl !Trait for Type {}     // or a different unstable syntax

After (first approach) (idiomatic, doesn't trigger a warning):

macro_rules! generate { ($( $tt:tt )*) => { $( $tt )* } }

#[cfg(feature = "nightly")]
generate! { impl !Send for NotSend {} }

After (second approach) (idiomatic, doesn't trigger a warning):

macro_rules! generate {
    // Of course, you can use macro metavariables to avoid code duplication etc.
    () => { impl !Trait for Type {} }
}

#[cfg(feature = "nightly")]
generate!();

If you'd like to see a more realistic example, head on over to https://github.com/arcnmx/packed-rs/pull/1/changes.

Steps

  1. Find the most recent relevant crater runs and manually reaudit affected crates
    • check if at least some crates have been fixed downstream by now
  2. Collect all features where the crater run has happened a long time ago & issue a single crater run for all of them at once
  3. For all the other ones that also don't emit a pre-expansion warning yet, add warnings immediately (done)
    • no further input from T-compiler/T-lang should be needed since it's already legitimized by MCP 535.

Affected Syntactic Constructs

  1. item modifier default (feature specialization or min_specialization for fns only)
    • we potentially want to drop this feature in favor of a different approach...
    • ...so a syntax gate would make it easier to phase out the syntax later on
    • issue a pre-expansion feature gate warning (legitimized by MCP 535)
    • turn the warning into a hard error (needs crater, T-lang FCP)
  2. trait impl modifier ! (feature negative_impls)
    • likely to be stabilized in 1–3 years, so a syntax gate isn't super pressing
    • issue a pre-expansion feature gate warning (legitimized by MCP 535)
    • turn the warning into a hard error (needs crater, T-lang FCP)
  3. expression try { … } (feature try_blocks)
    • already has a pre-expansion feature gate warning
    • incredibly likely to be stabilized this year...
    • ...so a syntax gate would be counterproductive / harmful (!)
    • turn the warning into a hard error (needs crater, T-lang FCP)
  4. pattern box $pat (feature box_patterns)
    • already has a pre-expansion feature gate warning
    • incredibly likely to be replaced with explicit or implicit deref patterns...
    • ...so a syntax gate would make it easier to phase out the syntax later on
    • turn the warning into a hard error (needs crater, T-lang FCP)
  5. pattern $patpath { box $ident }, pseudo binding mode (feature box_patterns)
    • incredibly likely to be replaced with explicit or implicit deref patterns...
    • ...so a syntax gate would make it easier to phase out the syntax later on
    • issue a pre-expansion feature gate warning (legitimized by MCP 535)
    • turn the warning into a hard error (needs crater, T-lang FCP)
  6. item trait $ident $genericparams = $bounds; (feature trait_alias)
    • already has a pre-expansion feature gate warning
    • turn the warning into a hard error (needs crater, T-lang FCP)
  7. trait item modifier auto (feature auto_traits)
    • already has a pre-expansion feature gate warning
    • turn the warning into a hard error (needs crater, T-lang FCP)
  8. (not fitting 100%) syntax impl $traitref for .. {} (early version of a now removed predecessor of feature auto_traits)
    • most recent crater run: PR RUST-121072
    • issue a pre-expansion feature gate warning (legitimized by MCP 535, maybe?)
    • reevaluate RUST-121072's crater report & send downstream patches
    • turn the warning into a hard error (needs T-lang FCP, maybe another crater run)
  9. item macro $ident$macroparams { $ttstar } (feature decl_macro)
    • already has a pre-expansion feature gate warning
    • turn the warning into a hard error (needs crater, T-lang FCP)
  10. (not fitting 100%) predicates $ty = $ty and $ty == $ty (no corresp. feature was ever added (cc RUST-22074, RUST-87471))
    • straight up hard error (crater: 0 regressions, needs T-lang FCP): PR RUST-153513

Pre-History (Incomplete)

Implementation History

Downstream Patches

Metadata

Metadata

Assignees

Labels

A-grammarArea: The grammar of RustA-lintsArea: Lints (warnings about flaws in source code) such as unused_mut.A-parserArea: The lexing & parsing of Rust source code to an ASTC-future-incompatibilityCategory: Future-incompatibility lintsC-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCL-unstable_syntax_pre_expansionLint: unstable-syntax-pre-expansionT-compilerRelevant to the compiler team, which will review and decide on the PR/issue.T-langRelevant to the language team

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions