Note the version and PR of removed features when using it

Signed-off-by: xizheyin <xizheyin@smail.nju.edu.cn>
This commit is contained in:
xizheyin
2025-05-27 17:29:17 +08:00
parent c2986eed43
commit b4ba017c33
18 changed files with 71 additions and 21 deletions

View File

@@ -62,6 +62,7 @@ expand_feature_not_allowed =
expand_feature_removed = expand_feature_removed =
feature has been removed feature has been removed
.label = feature has been removed .label = feature has been removed
.note = removed in {$removed_rustc_version} (you are using {$current_rustc_version}){$pull_note}
.reason = {$reason} .reason = {$reason}
expand_glob_delegation_outside_impls = expand_glob_delegation_outside_impls =

View File

@@ -80,9 +80,20 @@ pub fn features(sess: &Session, krate_attrs: &[Attribute], crate_name: Symbol) -
// If the enabled feature has been removed, issue an error. // If the enabled feature has been removed, issue an error.
if let Some(f) = REMOVED_LANG_FEATURES.iter().find(|f| name == f.feature.name) { if let Some(f) = REMOVED_LANG_FEATURES.iter().find(|f| name == f.feature.name) {
let pull_note = if let Some(pull) = f.pull {
format!(
"; see <https://github.com/rust-lang/rust/pull/{}> for more information",
pull
)
} else {
"".to_owned()
};
sess.dcx().emit_err(FeatureRemoved { sess.dcx().emit_err(FeatureRemoved {
span: mi.span(), span: mi.span(),
reason: f.reason.map(|reason| FeatureRemovedReason { reason }), reason: f.reason.map(|reason| FeatureRemovedReason { reason }),
removed_rustc_version: f.feature.since,
current_rustc_version: sess.cfg_version,
pull_note,
}); });
continue; continue;
} }

View File

@@ -154,12 +154,16 @@ pub(crate) struct HelperAttributeNameInvalid {
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(expand_feature_removed, code = E0557)] #[diag(expand_feature_removed, code = E0557)]
#[note]
pub(crate) struct FeatureRemoved<'a> { pub(crate) struct FeatureRemoved<'a> {
#[primary_span] #[primary_span]
#[label] #[label]
pub span: Span, pub span: Span,
#[subdiagnostic] #[subdiagnostic]
pub reason: Option<FeatureRemovedReason<'a>>, pub reason: Option<FeatureRemovedReason<'a>>,
pub removed_rustc_version: &'a str,
pub current_rustc_version: &'a str,
pub pull_note: String,
} }
#[derive(Subdiagnostic)] #[derive(Subdiagnostic)]

View File

@@ -1,5 +1,7 @@
//! List of the removed feature gates. //! List of the removed feature gates.
use std::num::{NonZero, NonZeroU32};
use rustc_span::sym; use rustc_span::sym;
use super::{Feature, to_nonzero}; use super::{Feature, to_nonzero};
@@ -7,11 +9,21 @@ use super::{Feature, to_nonzero};
pub struct RemovedFeature { pub struct RemovedFeature {
pub feature: Feature, pub feature: Feature,
pub reason: Option<&'static str>, pub reason: Option<&'static str>,
pub pull: Option<NonZero<u32>>,
}
macro_rules! opt_nonzero_u32 {
() => {
None
};
($val:expr) => {
Some(NonZeroU32::new($val).unwrap())
};
} }
macro_rules! declare_features { macro_rules! declare_features {
($( ($(
$(#[doc = $doc:tt])* (removed, $feature:ident, $ver:expr, $issue:expr, $reason:expr), $(#[doc = $doc:tt])* (removed, $feature:ident, $ver:expr, $issue:expr, $reason:expr $(, $pull:expr)?),
)+) => { )+) => {
/// Formerly unstable features that have now been removed. /// Formerly unstable features that have now been removed.
pub static REMOVED_LANG_FEATURES: &[RemovedFeature] = &[ pub static REMOVED_LANG_FEATURES: &[RemovedFeature] = &[
@@ -21,7 +33,8 @@ macro_rules! declare_features {
since: $ver, since: $ver,
issue: to_nonzero($issue), issue: to_nonzero($issue),
}, },
reason: $reason reason: $reason,
pull: opt_nonzero_u32!($($pull)?),
}),+ }),+
]; ];
}; };
@@ -120,7 +133,7 @@ declare_features! (
Some("subsumed by `::foo::bar` paths")), Some("subsumed by `::foo::bar` paths")),
/// Allows `#[doc(include = "some-file")]`. /// Allows `#[doc(include = "some-file")]`.
(removed, external_doc, "1.54.0", Some(44732), (removed, external_doc, "1.54.0", Some(44732),
Some("use #[doc = include_str!(\"filename\")] instead, which handles macro invocations")), Some("use #[doc = include_str!(\"filename\")] instead, which handles macro invocations"), 85457),
/// Allows using `#[ffi_returns_twice]` on foreign functions. /// Allows using `#[ffi_returns_twice]` on foreign functions.
(removed, ffi_returns_twice, "1.78.0", Some(58314), (removed, ffi_returns_twice, "1.78.0", Some(58314),
Some("being investigated by the ffi-unwind project group")), Some("being investigated by the ffi-unwind project group")),

View File

@@ -1,3 +1,5 @@
//@ normalize-stderr: "you are using [0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?( \([^)]*\))?" -> "you are using $$RUSTC_VERSION"
#![deny(warnings)] #![deny(warnings)]
#![feature(no_stack_check)] #![feature(no_stack_check)]
//~^ ERROR: feature has been removed [E0557] //~^ ERROR: feature has been removed [E0557]

View File

@@ -1,8 +1,10 @@
error[E0557]: feature has been removed error[E0557]: feature has been removed
--> $DIR/deprecated_no_stack_check.rs:2:12 --> $DIR/deprecated_no_stack_check.rs:4:12
| |
LL | #![feature(no_stack_check)] LL | #![feature(no_stack_check)]
| ^^^^^^^^^^^^^^ feature has been removed | ^^^^^^^^^^^^^^ feature has been removed
|
= note: removed in 1.0.0 (you are using $RUSTC_VERSION)
error: aborting due to 1 previous error error: aborting due to 1 previous error

View File

@@ -1,3 +1,5 @@
//@ normalize-stderr: "you are using [0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?( \([^)]*\))?" -> "you are using $$RUSTC_VERSION"
#![crate_type = "lib"] #![crate_type = "lib"]
#![feature(no_coverage)] //~ ERROR feature has been removed [E0557] #![feature(no_coverage)] //~ ERROR feature has been removed [E0557]

View File

@@ -1,13 +1,14 @@
error[E0557]: feature has been removed error[E0557]: feature has been removed
--> $DIR/feature-gate-coverage-attribute.rs:2:12 --> $DIR/feature-gate-coverage-attribute.rs:4:12
| |
LL | #![feature(no_coverage)] LL | #![feature(no_coverage)]
| ^^^^^^^^^^^ feature has been removed | ^^^^^^^^^^^ feature has been removed
| |
= note: removed in 1.74.0 (you are using $RUSTC_VERSION)
= note: renamed to `coverage_attribute` = note: renamed to `coverage_attribute`
error[E0658]: the `#[coverage]` attribute is an experimental feature error[E0658]: the `#[coverage]` attribute is an experimental feature
--> $DIR/feature-gate-coverage-attribute.rs:10:1 --> $DIR/feature-gate-coverage-attribute.rs:12:1
| |
LL | #[coverage(off)] LL | #[coverage(off)]
| ^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^

View File

@@ -1,3 +1,4 @@
//@ normalize-stderr: "you are using [0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?( \([^)]*\))?" -> "you are using $$RUSTC_VERSION"
#![feature(foo_bar_baz, foo(bar), foo = "baz", foo)] #![feature(foo_bar_baz, foo(bar), foo = "baz", foo)]
//~^ ERROR malformed `feature` //~^ ERROR malformed `feature`
//~| ERROR malformed `feature` //~| ERROR malformed `feature`

View File

@@ -1,41 +1,43 @@
error[E0556]: malformed `feature` attribute input error[E0556]: malformed `feature` attribute input
--> $DIR/gated-bad-feature.rs:1:25 --> $DIR/gated-bad-feature.rs:2:25
| |
LL | #![feature(foo_bar_baz, foo(bar), foo = "baz", foo)] LL | #![feature(foo_bar_baz, foo(bar), foo = "baz", foo)]
| ^^^^^^^^ help: expected just one word: `foo` | ^^^^^^^^ help: expected just one word: `foo`
error[E0556]: malformed `feature` attribute input error[E0556]: malformed `feature` attribute input
--> $DIR/gated-bad-feature.rs:1:35 --> $DIR/gated-bad-feature.rs:2:35
| |
LL | #![feature(foo_bar_baz, foo(bar), foo = "baz", foo)] LL | #![feature(foo_bar_baz, foo(bar), foo = "baz", foo)]
| ^^^^^^^^^^^ help: expected just one word: `foo` | ^^^^^^^^^^^ help: expected just one word: `foo`
error[E0557]: feature has been removed error[E0557]: feature has been removed
--> $DIR/gated-bad-feature.rs:8:12 --> $DIR/gated-bad-feature.rs:9:12
| |
LL | #![feature(test_removed_feature)] LL | #![feature(test_removed_feature)]
| ^^^^^^^^^^^^^^^^^^^^ feature has been removed | ^^^^^^^^^^^^^^^^^^^^ feature has been removed
|
= note: removed in 1.0.0 (you are using $RUSTC_VERSION)
error: malformed `feature` attribute input error: malformed `feature` attribute input
--> $DIR/gated-bad-feature.rs:6:1 --> $DIR/gated-bad-feature.rs:7:1
| |
LL | #![feature] LL | #![feature]
| ^^^^^^^^^^^ help: must be of the form: `#![feature(name1, name2, ...)]` | ^^^^^^^^^^^ help: must be of the form: `#![feature(name1, name2, ...)]`
error: malformed `feature` attribute input error: malformed `feature` attribute input
--> $DIR/gated-bad-feature.rs:7:1 --> $DIR/gated-bad-feature.rs:8:1
| |
LL | #![feature = "foo"] LL | #![feature = "foo"]
| ^^^^^^^^^^^^^^^^^^^ help: must be of the form: `#![feature(name1, name2, ...)]` | ^^^^^^^^^^^^^^^^^^^ help: must be of the form: `#![feature(name1, name2, ...)]`
error[E0635]: unknown feature `foo_bar_baz` error[E0635]: unknown feature `foo_bar_baz`
--> $DIR/gated-bad-feature.rs:1:12 --> $DIR/gated-bad-feature.rs:2:12
| |
LL | #![feature(foo_bar_baz, foo(bar), foo = "baz", foo)] LL | #![feature(foo_bar_baz, foo(bar), foo = "baz", foo)]
| ^^^^^^^^^^^ | ^^^^^^^^^^^
error[E0635]: unknown feature `foo` error[E0635]: unknown feature `foo`
--> $DIR/gated-bad-feature.rs:1:48 --> $DIR/gated-bad-feature.rs:2:48
| |
LL | #![feature(foo_bar_baz, foo(bar), foo = "baz", foo)] LL | #![feature(foo_bar_baz, foo(bar), foo = "baz", foo)]
| ^^^ | ^^^

View File

@@ -1,3 +1,5 @@
//@ normalize-stderr: "you are using [0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?( \([^)]*\))?" -> "you are using $$RUSTC_VERSION"
#![feature(external_doc)] //~ ERROR feature has been removed #![feature(external_doc)] //~ ERROR feature has been removed
#![doc(include("README.md"))] //~ ERROR unknown `doc` attribute `include` #![doc(include("README.md"))] //~ ERROR unknown `doc` attribute `include`

View File

@@ -1,13 +1,14 @@
error[E0557]: feature has been removed error[E0557]: feature has been removed
--> $DIR/removed-features-note-version-and-pr-issue-141619.rs:1:12 --> $DIR/removed-features-note-version-and-pr-issue-141619.rs:3:12
| |
LL | #![feature(external_doc)] LL | #![feature(external_doc)]
| ^^^^^^^^^^^^ feature has been removed | ^^^^^^^^^^^^ feature has been removed
| |
= note: removed in 1.54.0 (you are using $RUSTC_VERSION); see <https://github.com/rust-lang/rust/pull/85457> for more information
= note: use #[doc = include_str!("filename")] instead, which handles macro invocations = note: use #[doc = include_str!("filename")] instead, which handles macro invocations
error: unknown `doc` attribute `include` error: unknown `doc` attribute `include`
--> $DIR/removed-features-note-version-and-pr-issue-141619.rs:2:8 --> $DIR/removed-features-note-version-and-pr-issue-141619.rs:4:8
| |
LL | #![doc(include("README.md"))] LL | #![doc(include("README.md"))]
| ^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^

View File

@@ -1,4 +1,5 @@
//@ aux-build:two_macros.rs //@ aux-build:two_macros.rs
//@ normalize-stderr: "you are using [0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?( \([^)]*\))?" -> "you are using $$RUSTC_VERSION"
#![feature(macro_reexport)] //~ ERROR feature has been removed #![feature(macro_reexport)] //~ ERROR feature has been removed

View File

@@ -1,13 +1,14 @@
error[E0557]: feature has been removed error[E0557]: feature has been removed
--> $DIR/macro-reexport-removed.rs:3:12 --> $DIR/macro-reexport-removed.rs:4:12
| |
LL | #![feature(macro_reexport)] LL | #![feature(macro_reexport)]
| ^^^^^^^^^^^^^^ feature has been removed | ^^^^^^^^^^^^^^ feature has been removed
| |
= note: removed in 1.0.0 (you are using $RUSTC_VERSION)
= note: subsumed by `pub use` = note: subsumed by `pub use`
error: cannot find attribute `macro_reexport` in this scope error: cannot find attribute `macro_reexport` in this scope
--> $DIR/macro-reexport-removed.rs:5:3 --> $DIR/macro-reexport-removed.rs:6:3
| |
LL | #[macro_reexport(macro_one)] LL | #[macro_reexport(macro_one)]
| ^^^^^^^^^^^^^^ help: a built-in attribute with a similar name exists: `macro_export` | ^^^^^^^^^^^^^^ help: a built-in attribute with a similar name exists: `macro_export`

View File

@@ -1,3 +1,5 @@
//@ normalize-stderr: "you are using [0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?( \([^)]*\))?" -> "you are using $$RUSTC_VERSION"
#![feature(doc_keyword)] //~ ERROR #![feature(doc_keyword)] //~ ERROR
#![feature(doc_primitive)] //~ ERROR #![feature(doc_primitive)] //~ ERROR
#![crate_type = "lib"] #![crate_type = "lib"]

View File

@@ -1,17 +1,19 @@
error[E0557]: feature has been removed error[E0557]: feature has been removed
--> $DIR/renamed-features-rustdoc_internals.rs:1:12 --> $DIR/renamed-features-rustdoc_internals.rs:3:12
| |
LL | #![feature(doc_keyword)] LL | #![feature(doc_keyword)]
| ^^^^^^^^^^^ feature has been removed | ^^^^^^^^^^^ feature has been removed
| |
= note: removed in 1.28.0 (you are using $RUSTC_VERSION)
= note: merged into `#![feature(rustdoc_internals)]` = note: merged into `#![feature(rustdoc_internals)]`
error[E0557]: feature has been removed error[E0557]: feature has been removed
--> $DIR/renamed-features-rustdoc_internals.rs:2:12 --> $DIR/renamed-features-rustdoc_internals.rs:4:12
| |
LL | #![feature(doc_primitive)] LL | #![feature(doc_primitive)]
| ^^^^^^^^^^^^^ feature has been removed | ^^^^^^^^^^^^^ feature has been removed
| |
= note: removed in 1.56.0 (you are using $RUSTC_VERSION)
= note: merged into `#![feature(rustdoc_internals)]` = note: merged into `#![feature(rustdoc_internals)]`
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View File

@@ -6,6 +6,7 @@
// Regression test for issue #125877. // Regression test for issue #125877.
//@ compile-flags: -Znext-solver //@ compile-flags: -Znext-solver
//@ normalize-stderr: "you are using [0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?( \([^)]*\))?" -> "you are using $$RUSTC_VERSION"
#![feature(const_trait_impl, effects)] #![feature(const_trait_impl, effects)]
//~^ ERROR feature has been removed //~^ ERROR feature has been removed

View File

@@ -1,13 +1,14 @@
error[E0557]: feature has been removed error[E0557]: feature has been removed
--> $DIR/const-trait-impl-parameter-mismatch.rs:10:30 --> $DIR/const-trait-impl-parameter-mismatch.rs:11:30
| |
LL | #![feature(const_trait_impl, effects)] LL | #![feature(const_trait_impl, effects)]
| ^^^^^^^ feature has been removed | ^^^^^^^ feature has been removed
| |
= note: removed in 1.84.0 (you are using $RUSTC_VERSION)
= note: removed, redundant with `#![feature(const_trait_impl)]` = note: removed, redundant with `#![feature(const_trait_impl)]`
error[E0049]: associated function `compute` has 0 type parameters but its trait declaration has 1 type parameter error[E0049]: associated function `compute` has 0 type parameters but its trait declaration has 1 type parameter
--> $DIR/const-trait-impl-parameter-mismatch.rs:19:16 --> $DIR/const-trait-impl-parameter-mismatch.rs:20:16
| |
LL | fn compute<T: ~const Aux>() -> u32; LL | fn compute<T: ~const Aux>() -> u32;
| - expected 1 type parameter | - expected 1 type parameter