diff --git a/crates/bevy_ecs/hecs/src/query.rs b/crates/bevy_ecs/hecs/src/query.rs index 5486c1d23d..b192a1974d 100644 --- a/crates/bevy_ecs/hecs/src/query.rs +++ b/crates/bevy_ecs/hecs/src/query.rs @@ -263,6 +263,9 @@ macro_rules! impl_or_query { true $( && $T.should_skip(n) )+ } } + + unsafe impl<$( $T: ReadOnlyFetch ),+> ReadOnlyFetch for Or<($( $T ),+)> {} + unsafe impl<$( $T: ReadOnlyFetch ),+> ReadOnlyFetch for FetchOr<($( $T ),+)> {} }; } @@ -320,6 +323,7 @@ impl<'a, T: Component> Query for Mutated<'a, T> { #[doc(hidden)] pub struct FetchMutated(NonNull, NonNull); +unsafe impl ReadOnlyFetch for FetchMutated {} impl<'a, T: Component> Fetch<'a> for FetchMutated { type Item = Mutated<'a, T>; diff --git a/crates/bevy_ecs/src/system/into_system.rs b/crates/bevy_ecs/src/system/into_system.rs index 63a1df7276..502913a697 100644 --- a/crates/bevy_ecs/src/system/into_system.rs +++ b/crates/bevy_ecs/src/system/into_system.rs @@ -489,6 +489,43 @@ mod tests { assert!(*resources.get::().unwrap(), "system ran"); } + #[test] + fn or_query_set_system() { + // Regression test for issue #762 + use crate::{Added, Changed, Mutated, Or}; + fn query_system( + mut ran: ResMut, + set: QuerySet<( + Query, Changed)>>, + Query, Added)>>, + Query, Mutated)>>, + )>, + ) { + let changed = set.q0().iter().count(); + let added = set.q1().iter().count(); + let mutated = set.q2().iter().count(); + + assert_eq!(changed, 1); + assert_eq!(added, 1); + assert_eq!(mutated, 0); + + *ran = true; + } + + let mut world = World::default(); + let mut resources = Resources::default(); + resources.insert(false); + world.spawn((A, B)); + + let mut schedule = Schedule::default(); + schedule.add_stage("update"); + schedule.add_system_to_stage("update", query_system.system()); + + schedule.run(&mut world, &mut resources); + + assert!(*resources.get::().unwrap(), "system ran"); + } + #[test] fn changed_resource_system() { fn incr_e_on_flip(_run_on_flip: ChangedRes, mut i: Mut) {