diff options
| author | Urgau <urgau@numericable.fr> | 2024-02-14 19:12:19 +0100 |
|---|---|---|
| committer | Urgau <urgau@numericable.fr> | 2024-02-14 19:23:20 +0100 |
| commit | ddec8c5edc488e3eec27ed59a4d8e5dbaad4130f (patch) | |
| tree | 22724e0fd2ecc5b3ed7b38287847cc7ebfc2a54b | |
| parent | 502ce8287bc3c86dca07acc38c5ff9431a6097be (diff) | |
| download | rust-ddec8c5edc488e3eec27ed59a4d8e5dbaad4130f.tar.gz rust-ddec8c5edc488e3eec27ed59a4d8e5dbaad4130f.zip | |
Ignore unsized types when trying to determine the size of a type
| -rw-r--r-- | compiler/rustc_lint/src/reference_casting.rs | 7 | ||||
| -rw-r--r-- | tests/ui/lint/reference_casting.rs | 5 |
2 files changed, 12 insertions, 0 deletions
diff --git a/compiler/rustc_lint/src/reference_casting.rs b/compiler/rustc_lint/src/reference_casting.rs index 519ab8bd50f..f386db9d8db 100644 --- a/compiler/rustc_lint/src/reference_casting.rs +++ b/compiler/rustc_lint/src/reference_casting.rs @@ -207,6 +207,13 @@ fn is_cast_to_bigger_memory_layout<'tcx>( } let from_layout = cx.layout_of(*inner_start_ty).ok()?; + + // if the type isn't sized, we bail out, instead of potentially giving + // the user a meaningless warning. + if from_layout.is_unsized() { + return None; + } + let alloc_layout = cx.layout_of(alloc_ty).ok()?; let to_layout = cx.layout_of(*inner_end_ty).ok()?; diff --git a/tests/ui/lint/reference_casting.rs b/tests/ui/lint/reference_casting.rs index 63541943d65..e5d84e464fd 100644 --- a/tests/ui/lint/reference_casting.rs +++ b/tests/ui/lint/reference_casting.rs @@ -239,6 +239,11 @@ unsafe fn bigger_layout() { //~^ ERROR casting references to a bigger memory layout } + { + let x: Box<dyn Send> = Box::new(0i32); + let _z = unsafe { &*(&*x as *const dyn Send as *const i32) }; + } + unsafe fn from_ref(this: &i32) -> &i64 { &*(this as *const i32 as *const i64) } |
