yeet unsound lifetime annotations on Query
methods (#4243)
# Objective
Continuation of #2964 (I really should have checked other methods when I made that PR)
yeet unsound lifetime annotations on `Query` methods.
Example unsoundness:
```rust
use bevy::prelude::*;
fn main() {
App::new().add_startup_system(bar).add_system(foo).run();
}
pub fn bar(mut cmds: Commands) {
let e = cmds.spawn().insert(Foo { a: 10 }).id();
cmds.insert_resource(e);
}
#[derive(Component, Debug, PartialEq, Eq)]
pub struct Foo {
a: u32,
}
pub fn foo(mut query: Query<&mut Foo>, e: Res<Entity>) {
dbg!("hi");
{
let data: &Foo = query.get(*e).unwrap();
let data2: Mut<Foo> = query.get_mut(*e).unwrap();
assert_eq!(data, &*data2); // oops UB
}
{
let data: &Foo = query.single();
let data2: Mut<Foo> = query.single_mut();
assert_eq!(data, &*data2); // oops UB
}
{
let data: &Foo = query.get_single().unwrap();
let data2: Mut<Foo> = query.get_single_mut().unwrap();
assert_eq!(data, &*data2); // oops UB
}
{
let data: &Foo = query.iter().next().unwrap();
let data2: Mut<Foo> = query.iter_mut().next().unwrap();
assert_eq!(data, &*data2); // oops UB
}
{
let mut opt_data: Option<&Foo> = None;
let mut opt_data_2: Option<Mut<Foo>> = None;
query.for_each(|data| opt_data = Some(data));
query.for_each_mut(|data| opt_data_2 = Some(data));
assert_eq!(opt_data.unwrap(), &*opt_data_2.unwrap()); // oops UB
}
dbg!("bye");
}
```
## Solution
yeet unsound lifetime annotations on `Query` methods
Co-authored-by: Carter Anderson <mcanders1@gmail.com>