From 698f8c2f01ea549d77d7dc3338a12e04c11057b9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 17 Apr 2024 14:02:58 +0200 Subject: Adding upstream version 1.64.0+dfsg1. Signed-off-by: Daniel Baumann --- compiler/rustc_lint/src/expect.rs | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 compiler/rustc_lint/src/expect.rs (limited to 'compiler/rustc_lint/src/expect.rs') diff --git a/compiler/rustc_lint/src/expect.rs b/compiler/rustc_lint/src/expect.rs new file mode 100644 index 000000000..699e81543 --- /dev/null +++ b/compiler/rustc_lint/src/expect.rs @@ -0,0 +1,59 @@ +use crate::builtin; +use rustc_errors::fluent; +use rustc_hir::HirId; +use rustc_middle::ty::query::Providers; +use rustc_middle::{lint::LintExpectation, ty::TyCtxt}; +use rustc_session::lint::LintExpectationId; +use rustc_span::symbol::sym; +use rustc_span::Symbol; + +pub(crate) fn provide(providers: &mut Providers) { + *providers = Providers { check_expectations, ..*providers }; +} + +fn check_expectations(tcx: TyCtxt<'_>, tool_filter: Option) { + if !tcx.sess.features_untracked().enabled(sym::lint_reasons) { + return; + } + + let fulfilled_expectations = tcx.sess.diagnostic().steal_fulfilled_expectation_ids(); + let lint_expectations = &tcx.lint_levels(()).lint_expectations; + + for (id, expectation) in lint_expectations { + // This check will always be true, since `lint_expectations` only + // holds stable ids + if let LintExpectationId::Stable { hir_id, .. } = id { + if !fulfilled_expectations.contains(&id) + && tool_filter.map_or(true, |filter| expectation.lint_tool == Some(filter)) + { + emit_unfulfilled_expectation_lint(tcx, *hir_id, expectation); + } + } else { + unreachable!("at this stage all `LintExpectationId`s are stable"); + } + } +} + +fn emit_unfulfilled_expectation_lint( + tcx: TyCtxt<'_>, + hir_id: HirId, + expectation: &LintExpectation, +) { + tcx.struct_span_lint_hir( + builtin::UNFULFILLED_LINT_EXPECTATIONS, + hir_id, + expectation.emission_span, + |diag| { + let mut diag = diag.build(fluent::lint::expectation); + if let Some(rationale) = expectation.reason { + diag.note(rationale.as_str()); + } + + if expectation.is_unfulfilled_lint_expectations { + diag.note(fluent::lint::note); + } + + diag.emit(); + }, + ); +} -- cgit v1.2.3