mirror of
https://github.com/rust-lang/rust.git
synced 2025-11-24 16:39:04 +00:00
This reverts commit 1eeb8e8b151d1da7daa73837a25dc5f7a1a7fa28, reversing
changes made to 324bf2b9fd8bf9661e7045c8a93f5ff0ec1a8ca5.
Unfortunately the assert desugaring change is not backwards compatible,
see RUST-145770.
Code such as
```rust
#[derive(Debug)]
struct F {
data: bool
}
impl std::ops::Not for F {
type Output = bool;
fn not(self) -> Self::Output { !self.data }
}
fn main() {
let f = F { data: true };
assert!(f);
}
```
would be broken by the assert desugaring change. We may need to land
the change over an edition boundary, or limit the editions that the
desugaring change impacts.
28 lines
919 B
Rust
28 lines
919 B
Rust
//@ run-pass
|
|
//@ compile-flags: -C debug-assertions
|
|
|
|
#[repr(packed)]
|
|
struct Misaligner {
|
|
_head: u8,
|
|
tail: u64,
|
|
}
|
|
|
|
fn main() {
|
|
let memory = [Misaligner { _head: 0, tail: 0}, Misaligner { _head: 0, tail: 0}];
|
|
// Test that we can use addr_of! to get the address of a packed member which according to its
|
|
// type is not aligned, but because it is a projection from a packed type is a valid place.
|
|
let ptr0 = std::ptr::addr_of!(memory[0].tail);
|
|
let ptr1 = std::ptr::addr_of!(memory[0].tail);
|
|
// Even if ptr0 happens to be aligned by chance, ptr1 is not.
|
|
assert!(!ptr0.is_aligned() || !ptr1.is_aligned());
|
|
|
|
// And also test that we can get the addr of a packed struct then do a member read from it.
|
|
unsafe {
|
|
let ptr = std::ptr::addr_of!(memory[0]);
|
|
let _tail = (*ptr).tail;
|
|
|
|
let ptr = std::ptr::addr_of!(memory[1]);
|
|
let _tail = (*ptr).tail;
|
|
}
|
|
}
|