Skip to content

Commit f485a9f

Browse files
committed
Migrate 'int to fat pointer' cast diagnostic
1 parent e9f1646 commit f485a9f

File tree

3 files changed

+39
-28
lines changed

3 files changed

+39
-28
lines changed

compiler/rustc_hir_typeck/messages.ftl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ hir_typeck_functional_record_update_on_non_struct =
5959
6060
hir_typeck_help_set_edition_cargo = set `edition = "{$edition}"` in `Cargo.toml`
6161
hir_typeck_help_set_edition_standalone = pass `--edition {$edition}` to `rustc`
62+
63+
hir_typeck_int_to_fat = cannot cast `{$expr_ty}` to a pointer that {$known_wide ->
64+
[true] is
65+
*[false] may be
66+
} wide
67+
hir_typeck_int_to_fat_label = creating a `{$cast_ty}` requires both an address and {$metadata}
68+
hir_typeck_int_to_fat_label_nightly = consider casting this expression to `*const ()`, then using `core::ptr::from_raw_parts`
69+
6270
hir_typeck_lang_start_expected_sig_note = the `start` lang item should have the signature `fn(fn() -> T, isize, *const *const u8, u8) -> isize`
6371
6472
hir_typeck_lang_start_incorrect_number_params = incorrect number of parameters for the `start` lang item

compiler/rustc_hir_typeck/src/cast.rs

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,9 @@ impl<'a, 'tcx> CastCheck<'tcx> {
324324
CastError::CastToBool => {
325325
let expr_ty = fcx.resolve_vars_if_possible(self.expr_ty);
326326
let help = if self.expr_ty.is_numeric() {
327-
errors::CannotCastToBoolHelp::Numeric(self.expr_span.shrink_to_hi().with_hi(self.span.hi()))
327+
errors::CannotCastToBoolHelp::Numeric(
328+
self.expr_span.shrink_to_hi().with_hi(self.span.hi()),
329+
)
328330
} else {
329331
errors::CannotCastToBoolHelp::Unsupported(self.span)
330332
};
@@ -521,33 +523,20 @@ impl<'a, 'tcx> CastCheck<'tcx> {
521523
.emit();
522524
}
523525
CastError::IntToFatCast(known_metadata) => {
524-
let mut err = struct_span_err!(
525-
fcx.tcx.sess,
526-
self.cast_span,
527-
E0606,
528-
"cannot cast `{}` to a pointer that {} wide",
529-
fcx.ty_to_string(self.expr_ty),
530-
if known_metadata.is_some() { "is" } else { "may be" }
531-
);
532-
533-
err.span_label(
534-
self.cast_span,
535-
format!(
536-
"creating a `{}` requires both an address and {}",
537-
self.cast_ty,
538-
known_metadata.unwrap_or("type-specific metadata"),
539-
),
540-
);
541-
542-
if fcx.tcx.sess.is_nightly_build() {
543-
err.span_label(
544-
self.expr_span,
545-
"consider casting this expression to `*const ()`, \
546-
then using `core::ptr::from_raw_parts`",
547-
);
548-
}
549-
550-
err.emit();
526+
let expr_if_nightly = fcx.tcx.sess.is_nightly_build().then_some(self.expr_span);
527+
let cast_ty = fcx.resolve_vars_if_possible(self.cast_ty);
528+
let expr_ty = fcx.ty_to_string(self.expr_ty);
529+
let metadata = known_metadata.unwrap_or("type-specific metadata");
530+
let known_wide = known_metadata.is_some();
531+
let span = self.cast_span;
532+
fcx.tcx.sess.emit_err(errors::IntToWide {
533+
span,
534+
metadata,
535+
expr_ty,
536+
cast_ty,
537+
expr_if_nightly,
538+
known_wide,
539+
});
551540
}
552541
CastError::UnknownCastPtrKind | CastError::UnknownExprPtrKind => {
553542
let unknown_cast_to = match e {

compiler/rustc_hir_typeck/src/errors.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,20 @@ impl HelpUseLatestEdition {
315315
}
316316
}
317317

318+
#[derive(Diagnostic)]
319+
#[diag(hir_typeck_int_to_fat, code = "E0606")]
320+
pub struct IntToWide<'tcx> {
321+
#[primary_span]
322+
#[label(hir_typeck_int_to_fat_label)]
323+
pub span: Span,
324+
pub metadata: &'tcx str,
325+
pub expr_ty: String,
326+
pub cast_ty: Ty<'tcx>,
327+
#[label(hir_typeck_int_to_fat_label_nightly)]
328+
pub expr_if_nightly: Option<Span>,
329+
pub known_wide: bool,
330+
}
331+
318332
#[derive(Subdiagnostic)]
319333
pub enum OptionResultRefMismatch {
320334
#[suggestion(

0 commit comments

Comments
 (0)