diff --git a/src/internal/partial_solution.rs b/src/internal/partial_solution.rs index 44795582..c46b83d8 100644 --- a/src/internal/partial_solution.rs +++ b/src/internal/partial_solution.rs @@ -487,10 +487,14 @@ impl PartialSolution { satisfied_map.insert( satisfier_package, - satisfier_pa.satisfier( - satisfier_package, - &accum_term.intersection(&incompat_term.negate()), - ), + if accum_term.subset_of(incompat_term) { + (None, 0, DecisionLevel(1)) + } else { + satisfier_pa.satisfier( + satisfier_package, + &accum_term.intersection(&incompat_term.negate()), + ) + }, ); // Finally, let's identify the decision level of that previous satisfier. @@ -512,14 +516,16 @@ impl PackageAssignm package: &P, start_term: &Term, ) -> (Option>, u32, DecisionLevel) { - let empty = Term::empty(); // Indicate if we found a satisfier in the list of derivations, otherwise it will be the decision. let idx = self .dated_derivations .as_slice() .partition_point(|dd| !dd.accumulated_intersection.is_disjoint(start_term)); if let Some(dd) = self.dated_derivations.get(idx) { - debug_assert_eq!(dd.accumulated_intersection.intersection(start_term), empty); + debug_assert_eq!( + dd.accumulated_intersection.intersection(start_term), + Term::empty() + ); return (Some(dd.cause), dd.global_index, dd.decision_level); } // If it wasn't found in the derivations, diff --git a/tests/examples.rs b/tests/examples.rs index fcc237c1..5dbbb409 100644 --- a/tests/examples.rs +++ b/tests/examples.rs @@ -237,8 +237,8 @@ fn confusing_with_lots_of_holes() { }; assert_eq!( &DefaultStringReporter::report(&derivation_tree), - r#"Because there is no available version for bar and foo 1 | 2 | 3 | 4 | 5 depends on bar, foo 1 | 2 | 3 | 4 | 5 is forbidden. -And because there is no version of foo in <1 | >1, <2 | >2, <3 | >3, <4 | >4, <5 | >5 and root 1 depends on foo, root 1 is forbidden."# + r#"Because foo 1 | 2 | 3 | 4 | 5 depends on bar and there is no version of foo in <1 | >1, <2 | >2, <3 | >3, <4 | >4, <5 | >5, foo depends on bar. +And because there is no available version for bar and root 1 depends on foo, root 1 is forbidden."# ); derivation_tree.collapse_no_versions(); assert_eq!(