Lifetimes wrapped inside PhantomData

Lifetimes are done with a purely syntactic analysis. And because you are telling Rust that Struct2 may hold references into Struct1 (by tying their lifetimes together), it's invalid for you to call take_mut while that phantom borrow is active.