diff --git a/tests/run-pass/deref_partially_dangling_raw.rs b/tests/run-pass/deref_partially_dangling_raw.rs deleted file mode 100644 index 8639a289363b..000000000000 --- a/tests/run-pass/deref_partially_dangling_raw.rs +++ /dev/null @@ -1,9 +0,0 @@ -// Deref a raw ptr to access a field of a large struct, where the field -// is allocated but not the entire struct is. -// For now, we want to allow this. - -fn main() { - let x = (1, 1); - let xptr = &x as *const _ as *const (i32, i32, i32); - let _val = unsafe { (*xptr).1 }; -} diff --git a/tests/run-pass/stacked-borrows.rs b/tests/run-pass/stacked-borrows.rs new file mode 100644 index 000000000000..cde6968a2641 --- /dev/null +++ b/tests/run-pass/stacked-borrows.rs @@ -0,0 +1,27 @@ +// Test various stacked-borrows-related things. +fn main() { + deref_partially_dangling_raw(); + read_does_not_invalidate(); +} + +// Deref a raw ptr to access a field of a large struct, where the field +// is allocated but not the entire struct is. +// For now, we want to allow this. +fn deref_partially_dangling_raw() { + let x = (1, 1); + let xptr = &x as *const _ as *const (i32, i32, i32); + let _val = unsafe { (*xptr).1 }; +} + +// Make sure that reading from an `&mut` does, like reborrowing to `&`, +// NOT invalidate other reborrows. +fn read_does_not_invalidate() { + fn foo(x: &mut (i32, i32)) -> &i32 { + let xraw = x as *mut (i32, i32); + let ret = unsafe { &(*xraw).1 }; + let _val = x.1; // we just read, this does NOT invalidate the reborrows. + ret + } + + foo(&mut (1, 2)); +}