Report usage of lib features in ast validation

This commit is contained in:
Michael Goulet 2024-07-10 16:29:05 -04:00
parent c092b28976
commit 153a381104
4 changed files with 3 additions and 20 deletions

View File

@ -607,8 +607,7 @@ fn maybe_stage_features(sess: &Session, features: &Features, krate: &ast::Crate)
// does not check the same for lib features unless there's at least one // does not check the same for lib features unless there's at least one
// declared lang feature // declared lang feature
if !sess.opts.unstable_features.is_nightly_build() { if !sess.opts.unstable_features.is_nightly_build() {
let lang_features = &features.declared_lang_features; if features.declared_features.is_empty() {
if lang_features.len() == 0 {
return; return;
} }
for attr in krate.attrs.iter().filter(|attr| attr.has_name(sym::feature)) { for attr in krate.attrs.iter().filter(|attr| attr.has_name(sym::feature)) {
@ -624,7 +623,8 @@ fn maybe_stage_features(sess: &Session, features: &Features, krate: &ast::Crate)
attr.meta_item_list().into_iter().flatten().flat_map(|nested| nested.ident()) attr.meta_item_list().into_iter().flatten().flat_map(|nested| nested.ident())
{ {
let name = ident.name; let name = ident.name;
let stable_since = lang_features let stable_since = features
.declared_lang_features
.iter() .iter()
.flat_map(|&(feature, _, since)| if feature == name { since } else { None }) .flat_map(|&(feature, _, since)| if feature == name { since } else { None })
.next(); .next();

View File

@ -290,9 +290,6 @@ passes_export_name =
passes_extern_main = passes_extern_main =
the `main` function cannot be declared in an `extern` block the `main` function cannot be declared in an `extern` block
passes_feature_only_on_nightly =
`#![feature]` may not be used on the {$release_channel} release channel
passes_feature_previously_declared = passes_feature_previously_declared =
feature `{$feature}` is declared {$declared}, but was previously declared {$prev_declared} feature `{$feature}` is declared {$declared}, but was previously declared {$prev_declared}

View File

@ -1492,14 +1492,6 @@ pub struct TraitImplConstStable {
pub span: Span, pub span: Span,
} }
#[derive(Diagnostic)]
#[diag(passes_feature_only_on_nightly, code = E0554)]
pub struct FeatureOnlyOnNightly {
#[primary_span]
pub span: Span,
pub release_channel: &'static str,
}
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(passes_unknown_feature, code = E0635)] #[diag(passes_unknown_feature, code = E0635)]
pub struct UnknownFeature { pub struct UnknownFeature {

View File

@ -936,12 +936,6 @@ pub fn check_unused_or_stable_features(tcx: TyCtxt<'_>) {
let declared_lib_features = &tcx.features().declared_lib_features; let declared_lib_features = &tcx.features().declared_lib_features;
let mut remaining_lib_features = FxIndexMap::default(); let mut remaining_lib_features = FxIndexMap::default();
for (feature, span) in declared_lib_features { for (feature, span) in declared_lib_features {
if !tcx.sess.opts.unstable_features.is_nightly_build() {
tcx.dcx().emit_err(errors::FeatureOnlyOnNightly {
span: *span,
release_channel: env!("CFG_RELEASE_CHANNEL"),
});
}
if remaining_lib_features.contains_key(&feature) { if remaining_lib_features.contains_key(&feature) {
// Warn if the user enables a lib feature multiple times. // Warn if the user enables a lib feature multiple times.
tcx.dcx().emit_err(errors::DuplicateFeatureErr { span: *span, feature: *feature }); tcx.dcx().emit_err(errors::DuplicateFeatureErr { span: *span, feature: *feature });