Chase under aliases during occurs checking

Closes #4368
This commit is contained in:
Ayaz Hafiz 2022-11-15 16:21:00 -06:00
parent 2cc9c32c37
commit ce160f28a2
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
2 changed files with 29 additions and 2 deletions

View file

@ -8197,4 +8197,27 @@ mod solve_expr {
"### "###
); );
} }
#[test]
fn fix_recursion_under_alias_issue_4368() {
infer_eq_without_problem(
indoc!(
r#"
app "test" provides [doIt] to "./platform"
Effect : [
DoIt {} ({} -> Effect),
]
Task := ({} -> Effect) -> Effect
doIt : {} -> Task
doIt = \{} ->
@Task \toNext ->
DoIt {} \{} -> (toNext {})
"#
),
"{} -> Task",
)
}
} }

View file

@ -3255,13 +3255,17 @@ fn occurs(
EmptyRecord | EmptyTagUnion => Ok(()), EmptyRecord | EmptyTagUnion => Ok(()),
} }
} }
Alias(_, args, _, _) => { Alias(_, args, real_var, _) => {
let mut new_seen = seen.to_owned(); let mut new_seen = seen.to_owned();
new_seen.push(root_var); new_seen.push(root_var);
for var_index in args.into_iter() { for var_index in args.into_iter() {
let var = subs[var_index]; let var = subs[var_index];
short_circuit_help(subs, root_var, &new_seen, var)?; if short_circuit_help(subs, root_var, &new_seen, var).is_err() {
// Pay the cost and figure out what the actual recursion point is
return short_circuit_help(subs, root_var, &new_seen, *real_var);
}
} }
Ok(()) Ok(())