Emit an error for unstable attributes that reference already stable features
Add missing error annotations and .stderr file Acknowledge comments
This commit is contained in:
parent
363ae41883
commit
497100a13c
@ -745,6 +745,12 @@ passes_unrecognized_repr_hint =
|
|||||||
unrecognized representation hint
|
unrecognized representation hint
|
||||||
.help = valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
.help = valid reprs are `Rust` (default), `C`, `align`, `packed`, `transparent`, `simd`, `i8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`, `isize`, `usize`
|
||||||
|
|
||||||
|
passes_unstable_attr_for_already_stable_feature =
|
||||||
|
can't mark as unstable using an already stable feature
|
||||||
|
.label = this feature is already stable
|
||||||
|
.item = the stability attribute annotates this item
|
||||||
|
.help = consider removing the attribute
|
||||||
|
|
||||||
passes_unused =
|
passes_unused =
|
||||||
unused attribute
|
unused attribute
|
||||||
.suggestion = remove this attribute
|
.suggestion = remove this attribute
|
||||||
|
@ -1496,6 +1496,17 @@ pub(crate) struct CannotStabilizeDeprecated {
|
|||||||
pub item_sp: Span,
|
pub item_sp: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(passes_unstable_attr_for_already_stable_feature)]
|
||||||
|
pub(crate) struct UnstableAttrForAlreadyStableFeature {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
#[help]
|
||||||
|
pub span: Span,
|
||||||
|
#[label(passes_item)]
|
||||||
|
pub item_sp: Span,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(passes_missing_stability_attr)]
|
#[diag(passes_missing_stability_attr)]
|
||||||
pub(crate) struct MissingStabilityAttr<'a> {
|
pub(crate) struct MissingStabilityAttr<'a> {
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
};
|
};
|
||||||
use rustc_data_structures::fx::FxIndexMap;
|
use rustc_data_structures::fx::FxIndexMap;
|
||||||
use rustc_data_structures::unord::{ExtendUnord, UnordMap, UnordSet};
|
use rustc_data_structures::unord::{ExtendUnord, UnordMap, UnordSet};
|
||||||
|
use rustc_feature::ACCEPTED_FEATURES;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::{CRATE_DEF_ID, LOCAL_CRATE, LocalDefId, LocalModDefId};
|
use rustc_hir::def_id::{CRATE_DEF_ID, LOCAL_CRATE, LocalDefId, LocalModDefId};
|
||||||
@ -246,12 +247,27 @@ fn annotate<F>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Stability { level: Unstable { .. }, feature } = stab {
|
||||||
|
if ACCEPTED_FEATURES.iter().find(|f| f.name == feature).is_some() {
|
||||||
|
self.tcx
|
||||||
|
.dcx()
|
||||||
|
.emit_err(errors::UnstableAttrForAlreadyStableFeature { span, item_sp });
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Stability { level: Unstable { implied_by: Some(implied_by), .. }, feature } =
|
if let Stability { level: Unstable { implied_by: Some(implied_by), .. }, feature } =
|
||||||
stab
|
stab
|
||||||
{
|
{
|
||||||
self.index.implications.insert(implied_by, feature);
|
self.index.implications.insert(implied_by, feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(ConstStability { level: Unstable { .. }, feature, .. }) = const_stab {
|
||||||
|
if ACCEPTED_FEATURES.iter().find(|f| f.name == feature).is_some() {
|
||||||
|
self.tcx.dcx().emit_err(errors::UnstableAttrForAlreadyStableFeature {
|
||||||
|
span: const_span.unwrap(), // If const_stab contains Some(..), same is true for const_span
|
||||||
|
item_sp,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Some(ConstStability {
|
if let Some(ConstStability {
|
||||||
level: Unstable { implied_by: Some(implied_by), .. },
|
level: Unstable { implied_by: Some(implied_by), .. },
|
||||||
feature,
|
feature,
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
//! Ensure #[unstable] doesn't accept already stable features
|
||||||
|
|
||||||
|
#![feature(staged_api)]
|
||||||
|
#![stable(feature = "rust_test", since = "1.0.0")]
|
||||||
|
|
||||||
|
#[unstable(feature = "arbitrary_enum_discriminant", issue = "42")] //~ ERROR can't mark as unstable using an already stable feature
|
||||||
|
#[rustc_const_unstable(feature = "arbitrary_enum_discriminant", issue = "42")] //~ ERROR can't mark as unstable using an already stable feature
|
||||||
|
const fn my_fun() {}
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,31 @@
|
|||||||
|
error: can't mark as unstable using an already stable feature
|
||||||
|
--> $DIR/unstable-attribute-rejects-already-stable-features.rs:6:1
|
||||||
|
|
|
||||||
|
LL | #[unstable(feature = "arbitrary_enum_discriminant", issue = "42")]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this feature is already stable
|
||||||
|
LL | #[rustc_const_unstable(feature = "arbitrary_enum_discriminant", issue = "42")]
|
||||||
|
LL | const fn my_fun() {}
|
||||||
|
| -------------------- the stability attribute annotates this item
|
||||||
|
|
|
||||||
|
help: consider removing the attribute
|
||||||
|
--> $DIR/unstable-attribute-rejects-already-stable-features.rs:6:1
|
||||||
|
|
|
||||||
|
LL | #[unstable(feature = "arbitrary_enum_discriminant", issue = "42")]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: can't mark as unstable using an already stable feature
|
||||||
|
--> $DIR/unstable-attribute-rejects-already-stable-features.rs:7:1
|
||||||
|
|
|
||||||
|
LL | #[rustc_const_unstable(feature = "arbitrary_enum_discriminant", issue = "42")]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this feature is already stable
|
||||||
|
LL | const fn my_fun() {}
|
||||||
|
| -------------------- the stability attribute annotates this item
|
||||||
|
|
|
||||||
|
help: consider removing the attribute
|
||||||
|
--> $DIR/unstable-attribute-rejects-already-stable-features.rs:7:1
|
||||||
|
|
|
||||||
|
LL | #[rustc_const_unstable(feature = "arbitrary_enum_discriminant", issue = "42")]
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 2 previous errors
|
||||||
|
|
Loading…
Reference in New Issue
Block a user