Rollup merge of #81922 - magurotuna:issue81522, r=matthewjasper

Let `#[allow(unstable_name_collisions)]` work for things other than function

Fixes #81522

In addition to the report in #81522, currently `#[allow(unstable_name_collisions)]` doesn't suppress the corresponding diagnostics even if this attribute is appended to an expression statement or a let statement. It seems like this is because the wrong `HirId` is passed to `struct_span_lint_hir`.
It's fixed in this PR, and a regression test for it is also added.
This commit is contained in:
Dylan DPC 2021-04-05 13:03:36 +02:00 committed by GitHub
commit 54ea8e1b82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 1 deletions

View File

@ -83,6 +83,8 @@ struct ProbeContext<'a, 'tcx> {
unsatisfied_predicates: Vec<(ty::Predicate<'tcx>, Option<ty::Predicate<'tcx>>)>,
is_suggestion: IsSuggestion,
scope_expr_id: hir::HirId,
}
impl<'a, 'tcx> Deref for ProbeContext<'a, 'tcx> {
@ -448,6 +450,7 @@ fn probe_op<OP, R>(
orig_values,
steps.steps,
is_suggestion,
scope_expr_id,
);
probe_cx.assemble_inherent_candidates();
@ -547,6 +550,7 @@ fn new(
orig_steps_var_values: OriginalQueryValues<'tcx>,
steps: Lrc<Vec<CandidateStep<'tcx>>>,
is_suggestion: IsSuggestion,
scope_expr_id: hir::HirId,
) -> ProbeContext<'a, 'tcx> {
ProbeContext {
fcx,
@ -564,6 +568,7 @@ fn new(
private_candidate: None,
unsatisfied_predicates: Vec::new(),
is_suggestion,
scope_expr_id,
}
}
@ -1312,7 +1317,7 @@ fn emit_unstable_name_collision_hint(
) {
self.tcx.struct_span_lint_hir(
lint::builtin::UNSTABLE_NAME_COLLISIONS,
self.fcx.body_id,
self.scope_expr_id,
self.span,
|lint| {
let def_kind = stable_pick.item.kind.as_def_kind();
@ -1594,6 +1599,7 @@ fn probe_for_lev_candidate(&mut self) -> Result<Option<ty::AssocItem>, MethodErr
self.orig_steps_var_values.clone(),
steps,
IsSuggestion(true),
self.scope_expr_id,
);
pcx.allow_similar_names = true;
pcx.assemble_inherent_candidates();

View File

@ -0,0 +1,31 @@
// Regression test for #81522.
// Ensures that `#[allow(unstable_name_collisions)]` appended to things other than function
// suppresses the corresponding diagnostics emitted from inside them.
// But note that this attribute doesn't work for macro invocations if it is appended directly.
// aux-build:inference_unstable_iterator.rs
// aux-build:inference_unstable_itertools.rs
// run-pass
extern crate inference_unstable_iterator;
extern crate inference_unstable_itertools;
#[allow(unused_imports)]
use inference_unstable_iterator::IpuIterator;
use inference_unstable_itertools::IpuItertools;
fn main() {
// expression statement
#[allow(unstable_name_collisions)]
'x'.ipu_flatten();
// let statement
#[allow(unstable_name_collisions)]
let _ = 'x'.ipu_flatten();
// block expression
#[allow(unstable_name_collisions)]
{
'x'.ipu_flatten();
}
}