Self-reference is allowed, but it prevents moving.
fn main() {
// ok
let mut inp = Input { words: vec![], phrase: String::from("foo bar") };
inp.words.push(&inp.phrase[0..3]);
inp.words.push(&inp.phrase[4..7]);
println!("{:?}", inp);
// this would give "cannot move out of `inp` because it is borrowed"
//let x = inp;
}