mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 09:14:20 +00:00
b2c717fa33
I was looking into `array::IntoIter` optimization, and noticed that it wasn't annotating the loads with `noundef` for simple things like `array::IntoIter<i32, N>`. Turned out to be a more general problem as `MaybeUninit::assume_init_read` isn't marking the load as initialized (<https://rust.godbolt.org/z/Mxd8TPTnv>), which is unfortunate since that's basically its reason to exist. This PR lowers `ptr::read(p)` to `copy *p` in MIR, which fortuitiously also improves the IR we give to LLVM for things like `mem::replace`.
21 lines
866 B
Plaintext
21 lines
866 B
Plaintext
error[E0080]: evaluation of constant value failed
|
|
--> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
|
|
|
|
= note: unable to turn pointer into raw bytes
|
|
|
|
|
= help: this code performed an operation that depends on the underlying bytes representing a pointer
|
|
= help: the absolute address of a pointer is not known at compile-time, so such operations are not supported
|
|
note: inside `std::ptr::read::<u8>`
|
|
--> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
|
note: inside `ptr::const_ptr::<impl *const u8>::read`
|
|
--> $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
|
note: inside `C`
|
|
--> $DIR/issue-miri-1910.rs:8:5
|
|
|
|
|
LL | (&foo as *const _ as *const u8).add(one_and_a_half_pointers).read();
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
error: aborting due to previous error
|
|
|
|
For more information about this error, try `rustc --explain E0080`.
|