diff options
| -rw-r--r-- | compiler/rustc_hir_typeck/messages.ftl | 18 | ||||
| -rw-r--r-- | compiler/rustc_hir_typeck/src/errors.rs | 22 | ||||
| -rw-r--r-- | compiler/rustc_hir_typeck/src/fallback.rs | 34 |
3 files changed, 44 insertions, 30 deletions
diff --git a/compiler/rustc_hir_typeck/messages.ftl b/compiler/rustc_hir_typeck/messages.ftl index ed288251021..0560d0d902a 100644 --- a/compiler/rustc_hir_typeck/messages.ftl +++ b/compiler/rustc_hir_typeck/messages.ftl @@ -99,15 +99,15 @@ hir_typeck_lossy_provenance_ptr2int = hir_typeck_missing_parentheses_in_range = can't call method `{$method_name}` on type `{$ty_str}` -hir_typeck_never_type_fallback_flowing_into_unsafe = - never type fallback affects this {$reason -> - [call] call to an `unsafe` function - [union_field] union access - [deref] raw pointer dereference - [path] `unsafe` function - [method] call to an `unsafe` method - *[other] THIS SHOULD NOT BE REACHABLE - } +hir_typeck_never_type_fallback_flowing_into_unsafe_call = never type fallback affects this call to an `unsafe` function + .help = specify the type explicitly +hir_typeck_never_type_fallback_flowing_into_unsafe_deref = never type fallback affects this raw pointer dereference + .help = specify the type explicitly +hir_typeck_never_type_fallback_flowing_into_unsafe_method = never type fallback affects this call to an `unsafe` method + .help = specify the type explicitly +hir_typeck_never_type_fallback_flowing_into_unsafe_path = never type fallback affects this `unsafe` function + .help = specify the type explicitly +hir_typeck_never_type_fallback_flowing_into_unsafe_union_field = never type fallback affects this union access .help = specify the type explicitly hir_typeck_no_associated_item = no {$item_kind} named `{$item_name}` found for {$ty_prefix} `{$ty_str}`{$trait_missing_method -> diff --git a/compiler/rustc_hir_typeck/src/errors.rs b/compiler/rustc_hir_typeck/src/errors.rs index 2bb46c8d288..ba8f246fd8d 100644 --- a/compiler/rustc_hir_typeck/src/errors.rs +++ b/compiler/rustc_hir_typeck/src/errors.rs @@ -1,7 +1,7 @@ //! Errors emitted by `rustc_hir_typeck`. use std::borrow::Cow; -use crate::{fallback::UnsafeUseReason, fluent_generated as fluent}; +use crate::fluent_generated as fluent; use rustc_errors::{ codes::*, Applicability, Diag, DiagArgValue, EmissionGuarantee, IntoDiagArg, MultiSpan, SubdiagMessageOp, Subdiagnostic, @@ -165,10 +165,22 @@ pub struct MissingParenthesesInRange { } #[derive(LintDiagnostic)] -#[diag(hir_typeck_never_type_fallback_flowing_into_unsafe)] -#[help] -pub struct NeverTypeFallbackFlowingIntoUnsafe { - pub reason: UnsafeUseReason, +pub enum NeverTypeFallbackFlowingIntoUnsafe { + #[help] + #[diag(hir_typeck_never_type_fallback_flowing_into_unsafe_call)] + Call, + #[help] + #[diag(hir_typeck_never_type_fallback_flowing_into_unsafe_method)] + Method, + #[help] + #[diag(hir_typeck_never_type_fallback_flowing_into_unsafe_path)] + Path, + #[help] + #[diag(hir_typeck_never_type_fallback_flowing_into_unsafe_union_field)] + UnionField, + #[help] + #[diag(hir_typeck_never_type_fallback_flowing_into_unsafe_deref)] + Deref, } #[derive(Subdiagnostic)] diff --git a/compiler/rustc_hir_typeck/src/fallback.rs b/compiler/rustc_hir_typeck/src/fallback.rs index 7a891915454..f240a53a679 100644 --- a/compiler/rustc_hir_typeck/src/fallback.rs +++ b/compiler/rustc_hir_typeck/src/fallback.rs @@ -1,11 +1,10 @@ -use std::{borrow::Cow, cell::OnceCell}; +use std::cell::OnceCell; use crate::{errors, FnCtxt, TypeckRootCtxt}; use rustc_data_structures::{ graph::{self, iterate::DepthFirstSearch, vec_graph::VecGraph}, unord::{UnordBag, UnordMap, UnordSet}, }; -use rustc_errors::{DiagArgValue, IntoDiagArg}; use rustc_hir as hir; use rustc_hir::intravisit::Visitor; use rustc_hir::HirId; @@ -380,7 +379,23 @@ impl<'tcx> FnCtxt<'_, 'tcx> { lint::builtin::NEVER_TYPE_FALLBACK_FLOWING_INTO_UNSAFE, hir_id, span, - errors::NeverTypeFallbackFlowingIntoUnsafe { reason }, + match reason { + UnsafeUseReason::Call => { + errors::NeverTypeFallbackFlowingIntoUnsafe::Call + } + UnsafeUseReason::Method => { + errors::NeverTypeFallbackFlowingIntoUnsafe::Method + } + UnsafeUseReason::Path => { + errors::NeverTypeFallbackFlowingIntoUnsafe::Path + } + UnsafeUseReason::UnionField => { + errors::NeverTypeFallbackFlowingIntoUnsafe::UnionField + } + UnsafeUseReason::Deref => { + errors::NeverTypeFallbackFlowingIntoUnsafe::Deref + } + }, ); } @@ -503,19 +518,6 @@ pub(crate) enum UnsafeUseReason { Deref, } -impl IntoDiagArg for UnsafeUseReason { - fn into_diag_arg(self) -> DiagArgValue { - let s = match self { - UnsafeUseReason::Call => "call", - UnsafeUseReason::Method => "method", - UnsafeUseReason::Path => "path", - UnsafeUseReason::UnionField => "union_field", - UnsafeUseReason::Deref => "deref", - }; - DiagArgValue::Str(Cow::Borrowed(s)) - } -} - /// Finds all type variables which are passed to an `unsafe` operation. /// /// For example, for this function `f`: |
