diff options
| author | Ben Kimock <kimockb@gmail.com> | 2023-06-15 18:02:55 -0400 |
|---|---|---|
| committer | Ben Kimock <kimockb@gmail.com> | 2023-06-16 09:06:12 -0400 |
| commit | c54672e25f41b8ef41d0ff94da8c9a06fd6ed0b5 (patch) | |
| tree | 2134074b61865fdc300cf2e0882a5bebc9d9c518 | |
| parent | 99b334696fffe8c08d2e6a978862849d5a89f875 (diff) | |
Disable alignment checks on i686-pc-windows-msvc
| -rw-r--r-- | compiler/rustc_mir_transform/src/check_alignment.rs | 3 | ||||
| -rw-r--r-- | tests/ui/mir/mir_alignment_check.rs | 1 | ||||
| -rw-r--r-- | tests/ui/mir/mir_alignment_check_i686-pc-windows-msvc.rs | 21 |
3 files changed, 25 insertions, 0 deletions
diff --git a/compiler/rustc_mir_transform/src/check_alignment.rs b/compiler/rustc_mir_transform/src/check_alignment.rs index ef64f70fdf3..3987614f951 100644 --- a/compiler/rustc_mir_transform/src/check_alignment.rs +++ b/compiler/rustc_mir_transform/src/check_alignment.rs @@ -15,6 +15,9 @@ pub struct CheckAlignment; impl<'tcx> MirPass<'tcx> for CheckAlignment { fn is_enabled(&self, sess: &Session) -> bool { + if sess.target.llvm_target == "i686-pc-windows-msvc" { + return false; + } sess.opts.debug_assertions } diff --git a/tests/ui/mir/mir_alignment_check.rs b/tests/ui/mir/mir_alignment_check.rs index 68a5384b30d..d1bf3d46a7c 100644 --- a/tests/ui/mir/mir_alignment_check.rs +++ b/tests/ui/mir/mir_alignment_check.rs @@ -1,5 +1,6 @@ // run-fail // ignore-wasm32-bare: No panic messages +// ignore-i686-pc-windows-msvc: #112480 // compile-flags: -C debug-assertions // error-pattern: misaligned pointer dereference: address must be a multiple of 0x4 but is diff --git a/tests/ui/mir/mir_alignment_check_i686-pc-windows-msvc.rs b/tests/ui/mir/mir_alignment_check_i686-pc-windows-msvc.rs new file mode 100644 index 00000000000..56388c1047e --- /dev/null +++ b/tests/ui/mir/mir_alignment_check_i686-pc-windows-msvc.rs @@ -0,0 +1,21 @@ +// run-pass +// only-i686-pc-windows-msvc +// compile-flags: -Copt-level=0 -Cdebug-assertions=yes + +// MSVC isn't sure if on 32-bit Windows its u64 type is 8-byte-aligned or 4-byte-aligned. +// So this test ensures that on i686-pc-windows-msvc, we do not insert a runtime check +// that will fail on dereferencing of a pointer to u64 which is not 8-byte-aligned but is +// 4-byte-aligned. + +#![feature(strict_provenance)] + +fn main() { + let mut x = [0u64; 2]; + let ptr: *mut u8 = x.as_mut_ptr().cast::<u8>(); + unsafe { + let misaligned = ptr.add(4).cast::<u64>(); + assert!(misaligned.addr() % 8 != 0); + assert!(misaligned.addr() % 4 == 0); + *misaligned = 42; + } +} |
