Skip to content

Commit

Permalink
Tests passing
Browse files Browse the repository at this point in the history
  • Loading branch information
chinedufn committed Sep 12, 2023
1 parent 8ad46b4 commit 7db9c3c
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 16 deletions.
34 changes: 20 additions & 14 deletions compiler/rustc_passes/src/dead.rs
Original file line number Diff line number Diff line change
Expand Up @@ -723,6 +723,12 @@ impl<'tcx> DeadVisitor<'tcx> {
ShouldWarnAboutField::Yes(is_positional)
}

// # Panics
// All `dead_codes` must have the same lint level, otherwise we will intentionally ICE.
// This is because we emit a multi-spanned lint using the lint level of the `dead_codes`'s
// first local def id.
// Prefer calling `Self.warn_dead_code` or `Self.warn_dead_code_grouped_by_lint_level`
// since those methods group by lint level before calling this method.
fn warn_multiple_dead_codes(
&self,
dead_codes: &[LocalDefId],
Expand All @@ -734,6 +740,15 @@ impl<'tcx> DeadVisitor<'tcx> {
return;
};
let tcx = self.tcx;

let first_hir_id = tcx.hir().local_def_id_to_hir_id(first_id);
let first_lint_level = tcx.lint_level_at_node(lint::builtin::DEAD_CODE, first_hir_id).0;
assert!(dead_codes.iter().skip(1).all(|id| {
let hir_id = tcx.hir().local_def_id_to_hir_id(*id);
let level = tcx.lint_level_at_node(lint::builtin::DEAD_CODE, hir_id).0;
level == first_lint_level
}));

let names: Vec<_> =
dead_codes.iter().map(|&def_id| tcx.item_name(def_id.to_def_id())).collect();
let spans: Vec<_> = dead_codes
Expand Down Expand Up @@ -814,18 +829,9 @@ impl<'tcx> DeadVisitor<'tcx> {
}
};

// FIXME: Remove this before landing the PR.
// Just keeping it around so that I remember how to get the expectation id.
// for id in &dead_codes[1..] {
// let hir = self.tcx.hir().local_def_id_to_hir_id(*id);
// let lint_level = self.tcx.lint_level_at_node(lint::builtin::DEAD_CODE, hir).0;
// if let Some(expectation_id) = lint_level.get_expectation_id() {
// self.tcx.sess.diagnostic().insert_fulfilled_expectation(expectation_id);
// }
// }
self.tcx.emit_spanned_lint(
lint,
tcx.hir().local_def_id_to_hir_id(first_id),
first_hir_id,
MultiSpan::from_spans(spans),
diag,
);
Expand Down Expand Up @@ -903,14 +909,14 @@ fn check_mod_deathness(tcx: TyCtxt<'_>, module: LocalDefId) {
if let hir::ItemKind::Impl(impl_item) = tcx.hir().item(item).kind {
let mut dead_items = Vec::new();
for item in impl_item.items {
let did = item.id.owner_id.def_id;
if !visitor.is_live_code(did) {
let def_id = item.id.owner_id.def_id;
if !visitor.is_live_code(def_id) {
let name = tcx.item_name(def_id.to_def_id());
let hir = tcx.hir().local_def_id_to_hir_id(did);
let hir = tcx.hir().local_def_id_to_hir_id(def_id);
let level = tcx.lint_level_at_node(lint::builtin::DEAD_CODE, hir).0;

dead_items.push(DeadVariant {
def_id: did,
def_id,
name,
level,
})
Expand Down
32 changes: 32 additions & 0 deletions tests/incremental/issue-114416-expect-unused-inside-impl-block.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// revisions: rpass1
//
// The corresponding ui test can be found in
// `tests/ui/lint/rfc-2383-lint-reason/expect_unused_inside_impl_block.rs`

#![feature(lint_reasons)]
#![warn(unused)]

struct OneUnused;
struct TwoUnused;

impl OneUnused {
#[expect(unused)]
fn unused() {}
}

impl TwoUnused {
#[expect(unused)]
fn unused1(){}

// This unused method has `#[expect(unused)]`, so the compiler should not emit a warning.
// This ui test was added after a regression in the compiler where it did not recognize multiple
// `#[expect(unused)]` annotations inside of impl blocks.
// issue 114416
#[expect(unused)]
fn unused2(){}
}

fn main() {
let _ = OneUnused;
let _ = TwoUnused;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
// check-pass
//
// The corresponding incremental compilation test can be found in
// `tests/incremental/issue-114416-expect-unused-inside-impl-block.rs`

#![feature(lint_reasons)]
#![warn(unused)]
Expand All @@ -15,8 +18,9 @@ impl TwoUnused {
#[expect(unused)]
fn unused1(){}

// Tests a regression where the compiler erroneously determined that all `#[expect(unused)]`
// after the first method in the impl block were unfulfilled.
// This unused method has `#[expect(unused)]`, so the compiler should not emit a warning.
// This ui test was added after a regression in the compiler where it did not recognize multiple
// `#[expect(unused)]` annotations inside of impl blocks.
// issue 114416
#[expect(unused)]
fn unused2(){}
Expand Down

0 comments on commit 7db9c3c

Please sign in to comment.