Rollup merge of #119388 - Enselic:prevent-lint-triplication, r=cjgillot
rustc_lint: Prevent triplication of various lints Prevent triplication of various lints. The triplication happens because we run the same lint three times (or less in some cases): * In `BuiltinCombinedPreExpansionLintPass` * In `BuiltinCombinedEarlyLintPass` * In `shallow_lint_levels_on()` Only run the lints one time by checking the `lint_added_lints` bool. Set your GitHub diff setting to ignore whitespaces changes when reviewing this PR, since I had to enclose a block inside an if. Closes #73301 (I found this while exploring the code related to [this](https://github.com/rust-lang/rust/pull/119251#discussion_r1435677330) comment.)
This commit is contained in:
commit
c8d42740c5
37 changed files with 64 additions and 664 deletions
|
@ -8,8 +8,8 @@ Example of erroneous code:
|
|||
|
||||
#[allow(non_snake_case)]
|
||||
fn main() {
|
||||
let MyNumber = 2; // error: allow(non_snake_case) overruled by outer
|
||||
// forbid(non_snake_case)
|
||||
// error: allow(non_snake_case) incompatible with previous forbid
|
||||
let MyNumber = 2;
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -1069,7 +1069,7 @@ impl<'a> EarlyContext<'a> {
|
|||
pub(crate) fn new(
|
||||
sess: &'a Session,
|
||||
features: &'a Features,
|
||||
warn_about_weird_lints: bool,
|
||||
lint_added_lints: bool,
|
||||
lint_store: &'a LintStore,
|
||||
registered_tools: &'a RegisteredTools,
|
||||
buffered: LintBuffer,
|
||||
|
@ -1078,7 +1078,7 @@ impl<'a> EarlyContext<'a> {
|
|||
builder: LintLevelsBuilder::new(
|
||||
sess,
|
||||
features,
|
||||
warn_about_weird_lints,
|
||||
lint_added_lints,
|
||||
lint_store,
|
||||
registered_tools,
|
||||
),
|
||||
|
|
|
@ -135,7 +135,7 @@ fn lint_expectations(tcx: TyCtxt<'_>, (): ()) -> Vec<(LintExpectationId, LintExp
|
|||
unstable_to_stable_ids: FxHashMap::default(),
|
||||
empty: FxHashMap::default(),
|
||||
},
|
||||
warn_about_weird_lints: false,
|
||||
lint_added_lints: false,
|
||||
store,
|
||||
registered_tools: tcx.registered_tools(()),
|
||||
};
|
||||
|
@ -164,7 +164,7 @@ fn shallow_lint_levels_on(tcx: TyCtxt<'_>, owner: hir::OwnerId) -> ShallowLintLe
|
|||
empty: FxHashMap::default(),
|
||||
attrs,
|
||||
},
|
||||
warn_about_weird_lints: false,
|
||||
lint_added_lints: false,
|
||||
store,
|
||||
registered_tools: tcx.registered_tools(()),
|
||||
};
|
||||
|
@ -451,7 +451,7 @@ pub struct LintLevelsBuilder<'s, P> {
|
|||
sess: &'s Session,
|
||||
features: &'s Features,
|
||||
provider: P,
|
||||
warn_about_weird_lints: bool,
|
||||
lint_added_lints: bool,
|
||||
store: &'s LintStore,
|
||||
registered_tools: &'s RegisteredTools,
|
||||
}
|
||||
|
@ -464,7 +464,7 @@ impl<'s> LintLevelsBuilder<'s, TopDown> {
|
|||
pub(crate) fn new(
|
||||
sess: &'s Session,
|
||||
features: &'s Features,
|
||||
warn_about_weird_lints: bool,
|
||||
lint_added_lints: bool,
|
||||
store: &'s LintStore,
|
||||
registered_tools: &'s RegisteredTools,
|
||||
) -> Self {
|
||||
|
@ -472,7 +472,7 @@ impl<'s> LintLevelsBuilder<'s, TopDown> {
|
|||
sess,
|
||||
features,
|
||||
provider: TopDown { sets: LintLevelSets::new(), cur: COMMAND_LINE },
|
||||
warn_about_weird_lints,
|
||||
lint_added_lints,
|
||||
store,
|
||||
registered_tools,
|
||||
};
|
||||
|
@ -642,7 +642,7 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
|
|||
//
|
||||
// This means that this only errors if we're truly lowering the lint
|
||||
// level from forbid.
|
||||
if level != Level::Forbid {
|
||||
if self.lint_added_lints && level != Level::Forbid {
|
||||
if let Level::Forbid = old_level {
|
||||
// Backwards compatibility check:
|
||||
//
|
||||
|
@ -968,7 +968,7 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
|
|||
continue;
|
||||
}
|
||||
|
||||
_ if !self.warn_about_weird_lints => {}
|
||||
_ if !self.lint_added_lints => {}
|
||||
|
||||
CheckLintNameResult::Renamed(ref replace) => {
|
||||
let suggestion =
|
||||
|
@ -1029,7 +1029,7 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
|
|||
}
|
||||
}
|
||||
|
||||
if !is_crate_node {
|
||||
if self.lint_added_lints && !is_crate_node {
|
||||
for (id, &(level, ref src)) in self.current_specs().iter() {
|
||||
if !id.lint.crate_level_only {
|
||||
continue;
|
||||
|
@ -1054,33 +1054,33 @@ impl<'s, P: LintLevelsProvider> LintLevelsBuilder<'s, P> {
|
|||
/// Checks if the lint is gated on a feature that is not enabled.
|
||||
///
|
||||
/// Returns `true` if the lint's feature is enabled.
|
||||
// FIXME only emit this once for each attribute, instead of repeating it 4 times for
|
||||
// pre-expansion lints, post-expansion lints, `shallow_lint_levels_on` and `lint_expectations`.
|
||||
#[track_caller]
|
||||
fn check_gated_lint(&self, lint_id: LintId, span: Span, lint_from_cli: bool) -> bool {
|
||||
if let Some(feature) = lint_id.lint.feature_gate {
|
||||
if !self.features.active(feature) {
|
||||
let lint = builtin::UNKNOWN_LINTS;
|
||||
let (level, src) = self.lint_level(builtin::UNKNOWN_LINTS);
|
||||
struct_lint_level(
|
||||
self.sess,
|
||||
lint,
|
||||
level,
|
||||
src,
|
||||
Some(span.into()),
|
||||
fluent::lint_unknown_gated_lint,
|
||||
|lint| {
|
||||
lint.set_arg("name", lint_id.lint.name_lower());
|
||||
lint.note(fluent::lint_note);
|
||||
rustc_session::parse::add_feature_diagnostics_for_issue(
|
||||
lint,
|
||||
&self.sess.parse_sess,
|
||||
feature,
|
||||
GateIssue::Language,
|
||||
lint_from_cli,
|
||||
);
|
||||
},
|
||||
);
|
||||
if self.lint_added_lints {
|
||||
let lint = builtin::UNKNOWN_LINTS;
|
||||
let (level, src) = self.lint_level(builtin::UNKNOWN_LINTS);
|
||||
struct_lint_level(
|
||||
self.sess,
|
||||
lint,
|
||||
level,
|
||||
src,
|
||||
Some(span.into()),
|
||||
fluent::lint_unknown_gated_lint,
|
||||
|lint| {
|
||||
lint.set_arg("name", lint_id.lint.name_lower());
|
||||
lint.note(fluent::lint_note);
|
||||
rustc_session::parse::add_feature_diagnostics_for_issue(
|
||||
lint,
|
||||
&self.sess.parse_sess,
|
||||
feature,
|
||||
GateIssue::Language,
|
||||
lint_from_cli,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue