mirror of https://github.com/rust-lang/rust.git
Rollup merge of #127319 - oli-obk:fail2taint, r=compiler-errors
Remove a use of `StructuredDiag`, which is incompatible with automatic error tainting and error translations fixes #127219 I want to remove all of `StructuredDiag`, but it's a bit more involved as it is also used from the `ItemCtxt`, which doesn't support tainting yet.
This commit is contained in:
commit
dd42f7a0a6
|
@ -55,8 +55,6 @@ hir_analysis_cannot_capture_late_bound_ty =
|
||||||
cannot capture late-bound type parameter in {$what}
|
cannot capture late-bound type parameter in {$what}
|
||||||
.label = parameter defined here
|
.label = parameter defined here
|
||||||
|
|
||||||
hir_analysis_cast_thin_pointer_to_fat_pointer = cannot cast thin pointer `{$expr_ty}` to fat pointer `{$cast_ty}`
|
|
||||||
|
|
||||||
hir_analysis_closure_implicit_hrtb = implicit types in closure signatures are forbidden when `for<...>` is present
|
hir_analysis_closure_implicit_hrtb = implicit types in closure signatures are forbidden when `for<...>` is present
|
||||||
.label = `for<...>` is here
|
.label = `for<...>` is here
|
||||||
|
|
||||||
|
|
|
@ -706,15 +706,6 @@ pub(crate) struct PassToVariadicFunction<'tcx, 'a> {
|
||||||
pub help: Option<()>,
|
pub help: Option<()>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
|
||||||
#[diag(hir_analysis_cast_thin_pointer_to_fat_pointer, code = E0607)]
|
|
||||||
pub(crate) struct CastThinPointerToFatPointer<'tcx> {
|
|
||||||
#[primary_span]
|
|
||||||
pub span: Span,
|
|
||||||
pub expr_ty: Ty<'tcx>,
|
|
||||||
pub cast_ty: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(hir_analysis_invalid_union_field, code = E0740)]
|
#[diag(hir_analysis_invalid_union_field, code = E0740)]
|
||||||
pub(crate) struct InvalidUnionField {
|
pub(crate) struct InvalidUnionField {
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
mod missing_cast_for_variadic_arg;
|
mod missing_cast_for_variadic_arg;
|
||||||
mod sized_unsized_cast;
|
|
||||||
mod wrong_number_of_generic_args;
|
mod wrong_number_of_generic_args;
|
||||||
|
|
||||||
pub use self::{
|
pub use self::{missing_cast_for_variadic_arg::*, wrong_number_of_generic_args::*};
|
||||||
missing_cast_for_variadic_arg::*, sized_unsized_cast::*, wrong_number_of_generic_args::*,
|
|
||||||
};
|
|
||||||
|
|
||||||
use rustc_errors::{Diag, ErrCode};
|
use rustc_errors::{Diag, ErrCode};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
|
|
|
@ -1,56 +0,0 @@
|
||||||
use crate::{errors, structured_errors::StructuredDiag};
|
|
||||||
use rustc_errors::{codes::*, Diag};
|
|
||||||
use rustc_middle::ty::{Ty, TypeVisitableExt};
|
|
||||||
use rustc_session::Session;
|
|
||||||
use rustc_span::Span;
|
|
||||||
|
|
||||||
pub struct SizedUnsizedCast<'tcx> {
|
|
||||||
pub sess: &'tcx Session,
|
|
||||||
pub span: Span,
|
|
||||||
pub expr_ty: Ty<'tcx>,
|
|
||||||
pub cast_ty: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> StructuredDiag<'tcx> for SizedUnsizedCast<'tcx> {
|
|
||||||
fn session(&self) -> &Session {
|
|
||||||
self.sess
|
|
||||||
}
|
|
||||||
|
|
||||||
fn code(&self) -> ErrCode {
|
|
||||||
E0607
|
|
||||||
}
|
|
||||||
|
|
||||||
fn diagnostic_common(&self) -> Diag<'tcx> {
|
|
||||||
let mut err = self.sess.dcx().create_err(errors::CastThinPointerToFatPointer {
|
|
||||||
span: self.span,
|
|
||||||
expr_ty: self.expr_ty,
|
|
||||||
cast_ty: self.cast_ty.to_owned(),
|
|
||||||
});
|
|
||||||
|
|
||||||
if self.expr_ty.references_error() {
|
|
||||||
err.downgrade_to_delayed_bug();
|
|
||||||
}
|
|
||||||
|
|
||||||
err
|
|
||||||
}
|
|
||||||
|
|
||||||
fn diagnostic_extended(&self, mut err: Diag<'tcx>) -> Diag<'tcx> {
|
|
||||||
err.help(
|
|
||||||
"Thin pointers are \"simple\" pointers: they are purely a reference to a
|
|
||||||
memory address.
|
|
||||||
|
|
||||||
Fat pointers are pointers referencing \"Dynamically Sized Types\" (also
|
|
||||||
called DST). DST don't have a statically known size, therefore they can
|
|
||||||
only exist behind some kind of pointers that contain additional
|
|
||||||
information. Slices and trait objects are DSTs. In the case of slices,
|
|
||||||
the additional information the fat pointer holds is their size.
|
|
||||||
|
|
||||||
To fix this error, don't try to cast directly between thin and fat
|
|
||||||
pointers.
|
|
||||||
|
|
||||||
For more information about casts, take a look at The Book:
|
|
||||||
https://doc.rust-lang.org/reference/expressions/operator-expr.html#type-cast-expressions",
|
|
||||||
);
|
|
||||||
err
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -23,6 +23,21 @@ hir_typeck_cannot_cast_to_bool = cannot cast `{$expr_ty}` as `bool`
|
||||||
|
|
||||||
hir_typeck_cast_enum_drop = cannot cast enum `{$expr_ty}` into integer `{$cast_ty}` because it implements `Drop`
|
hir_typeck_cast_enum_drop = cannot cast enum `{$expr_ty}` into integer `{$cast_ty}` because it implements `Drop`
|
||||||
|
|
||||||
|
hir_typeck_cast_thin_pointer_to_fat_pointer = cannot cast thin pointer `{$expr_ty}` to fat pointer `{$cast_ty}`
|
||||||
|
.teach_help = Thin pointers are "simple" pointers: they are purely a reference to a
|
||||||
|
memory address.
|
||||||
|
|
||||||
|
Fat pointers are pointers referencing "Dynamically Sized Types" (also
|
||||||
|
called DST). DST don't have a statically known size, therefore they can
|
||||||
|
only exist behind some kind of pointers that contain additional
|
||||||
|
information. Slices and trait objects are DSTs. In the case of slices,
|
||||||
|
the additional information the fat pointer holds is their size.
|
||||||
|
|
||||||
|
To fix this error, don't try to cast directly between thin and fat
|
||||||
|
pointers.
|
||||||
|
|
||||||
|
For more information about casts, take a look at The Book:
|
||||||
|
https://doc.rust-lang.org/reference/expressions/operator-expr.html#type-cast-expressions",
|
||||||
hir_typeck_cast_unknown_pointer = cannot cast {$to ->
|
hir_typeck_cast_unknown_pointer = cannot cast {$to ->
|
||||||
[true] to
|
[true] to
|
||||||
*[false] from
|
*[false] from
|
||||||
|
|
|
@ -500,16 +500,12 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
||||||
err.emit();
|
err.emit();
|
||||||
}
|
}
|
||||||
CastError::SizedUnsizedCast => {
|
CastError::SizedUnsizedCast => {
|
||||||
use rustc_hir_analysis::structured_errors::{SizedUnsizedCast, StructuredDiag};
|
fcx.dcx().emit_err(errors::CastThinPointerToFatPointer {
|
||||||
|
|
||||||
SizedUnsizedCast {
|
|
||||||
sess: fcx.tcx.sess,
|
|
||||||
span: self.span,
|
span: self.span,
|
||||||
expr_ty: self.expr_ty,
|
expr_ty: self.expr_ty,
|
||||||
cast_ty: fcx.ty_to_string(self.cast_ty),
|
cast_ty: fcx.ty_to_string(self.cast_ty),
|
||||||
}
|
teach: fcx.tcx.sess.teach(E0607).then_some(()),
|
||||||
.diagnostic()
|
});
|
||||||
.emit();
|
|
||||||
}
|
}
|
||||||
CastError::IntToFatCast(known_metadata) => {
|
CastError::IntToFatCast(known_metadata) => {
|
||||||
let expr_if_nightly = fcx.tcx.sess.is_nightly_build().then_some(self.expr_span);
|
let expr_if_nightly = fcx.tcx.sess.is_nightly_build().then_some(self.expr_span);
|
||||||
|
|
|
@ -689,3 +689,14 @@ pub struct ReplaceWithName {
|
||||||
pub span: Span,
|
pub span: Span,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(hir_typeck_cast_thin_pointer_to_fat_pointer, code = E0607)]
|
||||||
|
pub(crate) struct CastThinPointerToFatPointer<'tcx> {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
pub expr_ty: Ty<'tcx>,
|
||||||
|
pub cast_ty: String,
|
||||||
|
#[note(hir_typeck_teach_help)]
|
||||||
|
pub(crate) teach: Option<()>,
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
const FOO: &str = unsafe { &*(1_usize as *const [i64; 0] as *const [u8] as *const str) };
|
||||||
|
//~^ ERROR: cannot cast
|
||||||
|
|
||||||
|
fn main() {}
|
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0607]: cannot cast thin pointer `*const [i64; 0]` to fat pointer `*const [u8]`
|
||||||
|
--> $DIR/slice_elem_ty_mismatch_in_unsizing_cast.rs:1:31
|
||||||
|
|
|
||||||
|
LL | const FOO: &str = unsafe { &*(1_usize as *const [i64; 0] as *const [u8] as *const str) };
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0607`.
|
Loading…
Reference in New Issue