Better estimate polarity in exhaustiveness checking

This commit is contained in:
Ayaz Hafiz 2022-10-25 17:19:01 -05:00
parent 69114cc820
commit 7b9ce492c3
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58

View file

@ -1503,6 +1503,13 @@ fn solve(
expected_type,
);
let cond_source_is_likely_positive_value = category_and_expected.is_ok();
let cond_polarity = if cond_source_is_likely_positive_value {
Polarity::OF_VALUE
} else {
Polarity::OF_PATTERN
};
let real_content = subs.get_content_without_compacting(real_var);
let branches_content = subs.get_content_without_compacting(branches_var);
let already_have_error = matches!(
@ -1522,7 +1529,7 @@ fn solve(
branches_var,
real_var,
Mode::EQ,
Polarity::OF_PATTERN,
cond_polarity,
);
let should_check_exhaustiveness;
@ -1575,7 +1582,7 @@ fn solve(
real_var,
branches_var,
Mode::EQ,
Polarity::OF_PATTERN
cond_polarity,
),
Success { .. }
);
@ -1593,7 +1600,7 @@ fn solve(
real_var,
branches_var,
Mode::EQ,
Polarity::OF_PATTERN,
cond_polarity,
) {
Failure(vars, actual_type, expected_type, _bad_impls) => {
introduce(subs, rank, pools, &vars);
@ -1686,7 +1693,6 @@ fn solve(
// `C` was matched as well. Since the positive/negative value determination is
// only an estimate, we also only apply this heursitic in the "almost equal"
// case, when there was in fact a unification error.
let cond_source_is_likely_positive_value = category_and_expected.is_ok();
if cond_source_is_likely_positive_value && has_unification_error {
close_pattern_matched_tag_unions(subs, real_var);
}