This repo is a minimal reproduction of the UB when compiling owning_ref v0.4.0
.
Original failing case can be found here.
Source (extracted from src/main.rs)
fn helper(owning_ref: OwningRef<Box<Cell<u8>>, Cell<u8>>) -> u8 {
owning_ref.as_owner().set(10);
owning_ref.set(20);
owning_ref.as_owner().get() // note this should return the value 20
}
LLVM IR (extracted from out/ub.ll)
; main::helper
; Function Attrs: noinline nounwind nonlazybind uwtable
define internal fastcc i8 @_ZN4main6helper17hceb6202a66c63cf6E(i8* noalias align 1 dereferenceable(1), i8*) unnamed_addr #2 personality i32 (i32, i32, i64, %"unwind::libunwind::_Unwind_Exception"*, %"unwind::libunwind::_Unwind_Context"*)* @rust_eh_personality {
bb8:
store i8 20, i8* %1, align 1
tail call void @__rust_dealloc(i8* nonnull %0, i64 1, i64 1) #8
ret i8 10 ; note the compiler is returning the value 10, not 20
}