Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 2efd070

Browse files
committedFeb 6, 2021
Auto merge of #81774 - ehuss:beta-backports, r=ehuss
[beta] backports This backports: * CI: only copy python.exe to python3.exe if the latter does not exist #81762 * Make hitting the recursion limit in projection non-fatal #81055 * Remove incorrect `delay_span_bug` #81532 * introduce future-compatibility warning for forbidden lint groups #81556 * Update cargo #81755 * rustdoc: Fix visibility of trait and impl items #81288 * Work around missing -dev packages in solaris docker image. #81229 * Update LayoutError/LayoutErr stability attributes #81767 * Revert 78373 ("dont leak return value after panic in drop") #81257 * Rename `panic_fmt` lint to `non_fmt_panic` #81729
2 parents 1cd0303 + fc81b7c commit 2efd070

File tree

66 files changed

+11621
-11133
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+11621
-11133
lines changed
 

‎compiler/rustc_lint/src/context.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ use rustc_session::SessionLintStore;
3939
use rustc_span::lev_distance::find_best_match_for_name;
4040
use rustc_span::{symbol::Symbol, MultiSpan, Span, DUMMY_SP};
4141
use rustc_target::abi::LayoutOf;
42+
use tracing::debug;
4243

4344
use std::cell::Cell;
4445
use std::slice;
@@ -335,6 +336,20 @@ impl LintStore {
335336
}
336337
}
337338

339+
/// True if this symbol represents a lint group name.
340+
pub fn is_lint_group(&self, lint_name: Symbol) -> bool {
341+
debug!(
342+
"is_lint_group(lint_name={:?}, lint_groups={:?})",
343+
lint_name,
344+
self.lint_groups.keys().collect::<Vec<_>>()
345+
);
346+
let lint_name_str = &*lint_name.as_str();
347+
self.lint_groups.contains_key(&lint_name_str) || {
348+
let warnings_name_str = crate::WARNINGS.name_lower();
349+
lint_name_str == &*warnings_name_str
350+
}
351+
}
352+
338353
/// Checks the name of a lint for its existence, and whether it was
339354
/// renamed or removed. Generates a DiagnosticBuilder containing a
340355
/// warning for renamed and removed lints. This is over both lint

‎compiler/rustc_lint/src/levels.rs

Lines changed: 73 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_ast::attr;
55
use rustc_ast::unwrap_or;
66
use rustc_ast_pretty::pprust;
77
use rustc_data_structures::fx::FxHashMap;
8-
use rustc_errors::{struct_span_err, Applicability};
8+
use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder};
99
use rustc_hir as hir;
1010
use rustc_hir::def_id::{CrateNum, LOCAL_CRATE};
1111
use rustc_hir::{intravisit, HirId};
@@ -17,11 +17,15 @@ use rustc_middle::lint::{
1717
};
1818
use rustc_middle::ty::query::Providers;
1919
use rustc_middle::ty::TyCtxt;
20-
use rustc_session::lint::{builtin, Level, Lint, LintId};
20+
use rustc_session::lint::{
21+
builtin::{self, FORBIDDEN_LINT_GROUPS},
22+
Level, Lint, LintId,
23+
};
2124
use rustc_session::parse::feature_err;
2225
use rustc_session::Session;
2326
use rustc_span::symbol::{sym, Symbol};
2427
use rustc_span::{source_map::MultiSpan, Span, DUMMY_SP};
28+
use tracing::debug;
2529

2630
use std::cmp;
2731

@@ -51,6 +55,7 @@ pub struct LintLevelsBuilder<'s> {
5155
id_to_set: FxHashMap<HirId, u32>,
5256
cur: u32,
5357
warn_about_weird_lints: bool,
58+
store: &'s LintStore,
5459
}
5560

5661
pub struct BuilderPush {
@@ -59,13 +64,14 @@ pub struct BuilderPush {
5964
}
6065

6166
impl<'s> LintLevelsBuilder<'s> {
62-
pub fn new(sess: &'s Session, warn_about_weird_lints: bool, store: &LintStore) -> Self {
67+
pub fn new(sess: &'s Session, warn_about_weird_lints: bool, store: &'s LintStore) -> Self {
6368
let mut builder = LintLevelsBuilder {
6469
sess,
6570
sets: LintLevelSets::new(),
6671
cur: 0,
6772
id_to_set: Default::default(),
6873
warn_about_weird_lints,
74+
store,
6975
};
7076
builder.process_command_line(sess, store);
7177
assert_eq!(builder.sets.list.len(), 1);
@@ -120,36 +126,75 @@ impl<'s> LintLevelsBuilder<'s> {
120126
if let (Level::Forbid, old_src) =
121127
self.sets.get_lint_level(id.lint, self.cur, Some(&specs), &self.sess)
122128
{
123-
let mut diag_builder = struct_span_err!(
124-
self.sess,
125-
src.span(),
126-
E0453,
127-
"{}({}) incompatible with previous forbid",
128-
level.as_str(),
129-
src.name(),
129+
// Backwards compatibility check:
130+
//
131+
// We used to not consider `forbid(lint_group)`
132+
// as preventing `allow(lint)` for some lint `lint` in
133+
// `lint_group`. For now, issue a future-compatibility
134+
// warning for this case.
135+
let id_name = id.lint.name_lower();
136+
let fcw_warning = match old_src {
137+
LintLevelSource::Default => false,
138+
LintLevelSource::Node(symbol, _, _) => self.store.is_lint_group(symbol),
139+
LintLevelSource::CommandLine(symbol, _) => self.store.is_lint_group(symbol),
140+
};
141+
debug!(
142+
"fcw_warning={:?}, specs.get(&id) = {:?}, old_src={:?}, id_name={:?}",
143+
fcw_warning, specs, old_src, id_name
130144
);
131-
diag_builder.span_label(src.span(), "overruled by previous forbid");
132-
match old_src {
133-
LintLevelSource::Default => {
134-
diag_builder.note(&format!(
135-
"`forbid` lint level is the default for {}",
136-
id.to_string()
137-
));
138-
}
139-
LintLevelSource::Node(_, forbid_source_span, reason) => {
140-
diag_builder.span_label(forbid_source_span, "`forbid` level set here");
141-
if let Some(rationale) = reason {
142-
diag_builder.note(&rationale.as_str());
145+
146+
let decorate_diag_builder = |mut diag_builder: DiagnosticBuilder<'_>| {
147+
diag_builder.span_label(src.span(), "overruled by previous forbid");
148+
match old_src {
149+
LintLevelSource::Default => {
150+
diag_builder.note(&format!(
151+
"`forbid` lint level is the default for {}",
152+
id.to_string()
153+
));
154+
}
155+
LintLevelSource::Node(_, forbid_source_span, reason) => {
156+
diag_builder.span_label(forbid_source_span, "`forbid` level set here");
157+
if let Some(rationale) = reason {
158+
diag_builder.note(&rationale.as_str());
159+
}
160+
}
161+
LintLevelSource::CommandLine(_, _) => {
162+
diag_builder.note("`forbid` lint level was set on command line");
143163
}
144164
}
145-
LintLevelSource::CommandLine(_, _) => {
146-
diag_builder.note("`forbid` lint level was set on command line");
147-
}
165+
diag_builder.emit();
166+
};
167+
if !fcw_warning {
168+
let diag_builder = struct_span_err!(
169+
self.sess,
170+
src.span(),
171+
E0453,
172+
"{}({}) incompatible with previous forbid",
173+
level.as_str(),
174+
src.name(),
175+
);
176+
decorate_diag_builder(diag_builder);
177+
} else {
178+
self.struct_lint(
179+
FORBIDDEN_LINT_GROUPS,
180+
Some(src.span().into()),
181+
|diag_builder| {
182+
let diag_builder = diag_builder.build(&format!(
183+
"{}({}) incompatible with previous forbid",
184+
level.as_str(),
185+
src.name(),
186+
));
187+
decorate_diag_builder(diag_builder);
188+
},
189+
);
148190
}
149-
diag_builder.emit();
150191

151-
// Retain the forbid lint level
152-
return;
192+
// Retain the forbid lint level, unless we are
193+
// issuing a FCW. In the FCW case, we want to
194+
// respect the new setting.
195+
if !fcw_warning {
196+
return;
197+
}
153198
}
154199
}
155200
specs.insert(id, (level, src));

0 commit comments

Comments
 (0)
Please sign in to comment.