Auto merge of #18217 - ChayimFriedman2:cast-unknown-ptr, r=Veykril

fix: Comment out cast checks for unknown ptr kind

Just like we don't check for types containing unknown.

Fixes #18214.

See also https://rust-lang.zulipchat.com/#narrow/stream/185405-t-compiler.2Frust-analyzer/topic/Another.20case.20of.20.2318064.3F.
This commit is contained in:
bors 2024-10-14 11:24:08 +00:00
commit 574c89155b
2 changed files with 48 additions and 25 deletions

View file

@ -70,8 +70,9 @@ pub enum CastError {
NeedViaThinPtr, NeedViaThinPtr,
NeedViaInt, NeedViaInt,
NonScalar, NonScalar,
UnknownCastPtrKind, // We don't want to report errors with unknown types currently.
UnknownExprPtrKind, // UnknownCastPtrKind,
// UnknownExprPtrKind,
} }
impl CastError { impl CastError {
@ -272,9 +273,10 @@ impl CastCheck {
match (src_kind, dst_kind) { match (src_kind, dst_kind) {
(Some(PointerKind::Error), _) | (_, Some(PointerKind::Error)) => Ok(()), (Some(PointerKind::Error), _) | (_, Some(PointerKind::Error)) => Ok(()),
(_, None) => Err(CastError::UnknownCastPtrKind), // (_, None) => Err(CastError::UnknownCastPtrKind),
// (None, _) => Err(CastError::UnknownExprPtrKind),
(_, None) | (None, _) => Ok(()),
(_, Some(PointerKind::Thin)) => Ok(()), (_, Some(PointerKind::Thin)) => Ok(()),
(None, _) => Err(CastError::UnknownExprPtrKind),
(Some(PointerKind::Thin), _) => Err(CastError::SizedUnsizedCast), (Some(PointerKind::Thin), _) => Err(CastError::SizedUnsizedCast),
(Some(PointerKind::VTable(src_tty)), Some(PointerKind::VTable(dst_tty))) => { (Some(PointerKind::VTable(src_tty)), Some(PointerKind::VTable(dst_tty))) => {
let principal = |tty: &Binders<QuantifiedWhereClauses>| { let principal = |tty: &Binders<QuantifiedWhereClauses>| {
@ -315,7 +317,8 @@ impl CastCheck {
expr_ty: &Ty, expr_ty: &Ty,
) -> Result<(), CastError> { ) -> Result<(), CastError> {
match pointer_kind(expr_ty, table).map_err(|_| CastError::Unknown)? { match pointer_kind(expr_ty, table).map_err(|_| CastError::Unknown)? {
None => Err(CastError::UnknownExprPtrKind), // None => Err(CastError::UnknownExprPtrKind),
None => Ok(()),
Some(PointerKind::Error) => Ok(()), Some(PointerKind::Error) => Ok(()),
Some(PointerKind::Thin) => Ok(()), Some(PointerKind::Thin) => Ok(()),
_ => Err(CastError::NeedViaThinPtr), _ => Err(CastError::NeedViaThinPtr),
@ -328,7 +331,8 @@ impl CastCheck {
cast_ty: &Ty, cast_ty: &Ty,
) -> Result<(), CastError> { ) -> Result<(), CastError> {
match pointer_kind(cast_ty, table).map_err(|_| CastError::Unknown)? { match pointer_kind(cast_ty, table).map_err(|_| CastError::Unknown)? {
None => Err(CastError::UnknownCastPtrKind), // None => Err(CastError::UnknownCastPtrKind),
None => Ok(()),
Some(PointerKind::Error) => Ok(()), Some(PointerKind::Error) => Ok(()),
Some(PointerKind::Thin) => Ok(()), Some(PointerKind::Thin) => Ok(()),
Some(PointerKind::VTable(_)) => Err(CastError::IntToFatCast), Some(PointerKind::VTable(_)) => Err(CastError::IntToFatCast),
@ -343,7 +347,8 @@ impl CastCheck {
cast_ty: &Ty, cast_ty: &Ty,
) -> Result<(), CastError> { ) -> Result<(), CastError> {
match pointer_kind(cast_ty, table).map_err(|_| CastError::Unknown)? { match pointer_kind(cast_ty, table).map_err(|_| CastError::Unknown)? {
None => Err(CastError::UnknownCastPtrKind), // None => Err(CastError::UnknownCastPtrKind),
None => Ok(()),
Some(PointerKind::Error) => Ok(()), Some(PointerKind::Error) => Ok(()),
Some(PointerKind::Thin) => Ok(()), Some(PointerKind::Thin) => Ok(()),
_ => Err(CastError::IllegalCast), _ => Err(CastError::IllegalCast),

View file

@ -95,10 +95,10 @@ pub(crate) fn invalid_cast(ctx: &DiagnosticsContext<'_>, d: &hir::InvalidCast) -
DiagnosticCode::RustcHardError("E0605"), DiagnosticCode::RustcHardError("E0605"),
format_ty!(ctx, "non-primitive cast: `{}` as `{}`", d.expr_ty, d.cast_ty), format_ty!(ctx, "non-primitive cast: `{}` as `{}`", d.expr_ty, d.cast_ty),
), ),
CastError::UnknownCastPtrKind | CastError::UnknownExprPtrKind => ( // CastError::UnknownCastPtrKind | CastError::UnknownExprPtrKind => (
DiagnosticCode::RustcHardError("E0641"), // DiagnosticCode::RustcHardError("E0641"),
"cannot cast to a pointer of an unknown kind".to_owned(), // "cannot cast to a pointer of an unknown kind".to_owned(),
), // ),
}; };
Diagnostic::new(code, message, display_range) Diagnostic::new(code, message, display_range)
} }
@ -457,20 +457,20 @@ fn foo<T: ?Sized>() {
); );
} }
#[test] // #[test]
fn order_dependent_cast_inference() { // fn order_dependent_cast_inference() {
check_diagnostics( // check_diagnostics(
r#" // r#"
//- minicore: sized // //- minicore: sized
fn main() { // fn main() {
let x = &"hello"; // let x = &"hello";
let mut y = 0 as *const _; // let mut y = 0 as *const _;
//^^^^^^^^^^^^^ error: cannot cast to a pointer of an unknown kind // //^^^^^^^^^^^^^ error: cannot cast to a pointer of an unknown kind
y = x as *const _; // y = x as *const _;
} // }
"#, // "#,
); // );
} // }
#[test] #[test]
fn ptr_to_ptr_different_regions() { fn ptr_to_ptr_different_regions() {
@ -1111,4 +1111,22 @@ fn foo() {
"#, "#,
); );
} }
#[test]
fn cast_isize_to_infer_pointer() {
check_diagnostics(
r#"
//- minicore: coerce_unsized
struct Foo {}
struct Wrap<'a>(&'a mut Foo);
fn main() {
let lparam: isize = 0;
let _wrap = Wrap(unsafe { &mut *(lparam as *mut _) });
}
"#,
);
}
} }