diff options
| author | bors <bors@rust-lang.org> | 2022-05-20 01:05:53 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-05-20 01:05:53 +0000 |
| commit | 4d6992bc18e54522cced4f945f29f186992d5ea4 (patch) | |
| tree | b792b7921a20c181db9ae50451a8093887ae5cba /src/test/codegen | |
| parent | a09d36deae2e25f2eb4a0ee5d95519042ebd66a2 (diff) | |
| parent | 1c3921fa43ecc6438a1f4d5365d2f99caad7b847 (diff) | |
| download | rust-4d6992bc18e54522cced4f945f29f186992d5ea4.tar.gz rust-4d6992bc18e54522cced4f945f29f186992d5ea4.zip | |
Auto merge of #97027 - cuviper:yesalias-refcell, r=thomcc
Use pointers in `cell::{Ref,RefMut}` to avoid `noalias`
When `Ref` and `RefMut` were based on references, they would get LLVM `noalias` attributes that were incorrect, because that alias guarantee is only true until the guard drops. A `&RefCell` on the same value can get a new borrow that aliases the previous guard, possibly leading to miscompilation. Using `NonNull` pointers in `Ref` and `RefCell` avoids `noalias`.
Fixes the library side of #63787, but we still might want to explore language solutions there.
Diffstat (limited to 'src/test/codegen')
| -rw-r--r-- | src/test/codegen/noalias-refcell.rs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/test/codegen/noalias-refcell.rs b/src/test/codegen/noalias-refcell.rs new file mode 100644 index 00000000000..dba73937abf --- /dev/null +++ b/src/test/codegen/noalias-refcell.rs @@ -0,0 +1,14 @@ +// compile-flags: -O -C no-prepopulate-passes -Z mutable-noalias=yes + +#![crate_type = "lib"] + +use std::cell::{Ref, RefCell, RefMut}; + +// Make sure that none of the arguments get a `noalias` attribute, because +// the `RefCell` might alias writes after either `Ref`/`RefMut` is dropped. + +// CHECK-LABEL: @maybe_aliased( +// CHECK-NOT: noalias +// CHECK-SAME: %_refcell +#[no_mangle] +pub unsafe fn maybe_aliased(_: Ref<'_, i32>, _: RefMut<'_, i32>, _refcell: &RefCell<i32>) {} |
