| //! Check that functions with sret results don't violate aliasing rules. | |
| //! | |
| //! When `foo = func(&mut foo)` is called, the compiler must avoid creating | |
| //! two mutable references to the same variable simultaneously (one for the | |
| //! parameter and one for the hidden sret out-pointer). | |
| //! | |
| //! Regression test for <https://github.com/rust-lang/rust/pull/18250>. | |
| //@ run-pass | |
| #[derive(Copy, Clone)] | |
| pub struct Foo { | |
| f1: isize, | |
| _f2: isize, | |
| } | |
| #[inline(never)] | |
| pub fn foo(f: &mut Foo) -> Foo { | |
| let ret = *f; | |
| f.f1 = 0; | |
| ret | |
| } | |
| pub fn main() { | |
| let mut f = Foo { f1: 8, _f2: 9 }; | |
| f = foo(&mut f); | |
| assert_eq!(f.f1, 8); | |
| } |