Skip to content

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

Description

@fmease

Tip

If you've arrived here because you encountered a feature gate warning for unstable syntax behind #[cfg(…)], here's how 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)
    • remove the feature entirely instead (cratered, fcp'ed): remove box_patterns #156749
  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)
    • remove the feature entirely instead (cratered, fcp'ed): remove box_patterns #156749
  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
  11. attribute in certain expression contexts (feature stmt_expr_attributes)

Pre-History (Incomplete)

Implementation History

Downstream Patches

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions