forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#111517 - lukas-code:addr-of-mutate, r=tmiasko
allow mutating function args through `&raw const` Fixes rust-lang#111502 by "turning off the sketchy optimization while we figure out if this is ok", like `@JakobDegen` said. The first commit in this PR removes some suspicious looking logic from the same method, but should have no functional changes, since it doesn't modify the `context` outside of the method. Best reviewed commit by commit. r? opsem
- Loading branch information
Showing
2 changed files
with
51 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// compile-flags: -C opt-level=3 -C no-prepopulate-passes | ||
// min-llvm-version: 15.0 (for opaque pointers) | ||
|
||
#![crate_type = "lib"] | ||
|
||
// Test for the absence of `readonly` on the argument when it is mutated via `&raw const`. | ||
// See <https://github.com/rust-lang/rust/issues/111502>. | ||
|
||
// CHECK: i8 @foo(ptr noalias nocapture noundef dereferenceable(128) %x) | ||
#[no_mangle] | ||
pub fn foo(x: [u8; 128]) -> u8 { | ||
let ptr = core::ptr::addr_of!(x).cast_mut(); | ||
unsafe { | ||
(*ptr)[0] = 1; | ||
} | ||
x[0] | ||
} | ||
|
||
// CHECK: i1 @second(ptr noalias nocapture noundef dereferenceable({{[0-9]+}}) %a_ptr_and_b) | ||
#[no_mangle] | ||
pub unsafe fn second(a_ptr_and_b: (*mut (i32, bool), (i64, bool))) -> bool { | ||
let b_bool_ptr = core::ptr::addr_of!(a_ptr_and_b.1.1).cast_mut(); | ||
(*b_bool_ptr) = true; | ||
a_ptr_and_b.1.1 | ||
} | ||
|
||
// If going through a deref (and there are no other mutating accesses), then `readonly` is fine. | ||
// CHECK: i1 @third(ptr noalias nocapture noundef readonly dereferenceable({{[0-9]+}}) %a_ptr_and_b) | ||
#[no_mangle] | ||
pub unsafe fn third(a_ptr_and_b: (*mut (i32, bool), (i64, bool))) -> bool { | ||
let b_bool_ptr = core::ptr::addr_of!((*a_ptr_and_b.0).1).cast_mut(); | ||
(*b_bool_ptr) = true; | ||
a_ptr_and_b.1.1 | ||
} |