Skip to content

Commit

Permalink
Don't return definite guidance if we find one solution and then flounder
Browse files Browse the repository at this point in the history
If we find one solution and then flounder, this previously resulted in a
`Guidance::Definite` result. I think the reason is that `any_future_answer` has
no answers to check and hence returns true.
  • Loading branch information
flodiebold committed Feb 16, 2020
1 parent f85bb2e commit f1ce23a
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
4 changes: 4 additions & 0 deletions chalk-solve/src/solve/slg/aggregate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ impl<I: Interner> context::AggregateOps<SlgContext<I>> for SlgContextOps<'_, I>
break Guidance::Unknown;
}

if let AnswerResult::Floundered = answers.peek_answer(|| should_continue()) {
break Guidance::Suggested(subst);
}

if !answers.any_future_answer(|ref mut new_subst| new_subst.may_invalidate(&subst)) {
break Guidance::Definite(subst);
}
Expand Down
24 changes: 24 additions & 0 deletions tests/test/misc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,30 @@ fn flounder() {
}
}

/// Don't return definite guidance if we flounder after finding one solution.
#[test]
fn flounder_ambiguous() {
test! {
program {
trait IntoIterator { }
#[non_enumerable]
trait OtherTrait { }

struct Ref<T> { }
struct A { }

impl IntoIterator for Ref<A> { }
impl<T> IntoIterator for Ref<T> where T: OtherTrait { }
}

goal {
exists<T> { Ref<T>: IntoIterator }
} yields {
"Ambiguous; suggested substitution [?0 := A]"
}
}
}

// Test that, when solving `?T: Sized`, we only wind up pulling a few
// answers before we stop.
// Also tests that we search breadth-first.
Expand Down

0 comments on commit f1ce23a

Please sign in to comment.