mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 14:24:45 +00:00
fix problem with recursive definition constraint gen
This commit is contained in:
parent
b54c1a2194
commit
3aa6455795
7 changed files with 137 additions and 103 deletions
|
@ -1139,29 +1139,47 @@ fn adjust_rank(
|
|||
group_rank: Rank,
|
||||
var: Variable,
|
||||
) -> Rank {
|
||||
let mut desc = subs.get(var);
|
||||
let mark = desc.mark;
|
||||
let desc = subs.get(var);
|
||||
|
||||
if mark == young_mark {
|
||||
desc.mark = visit_mark;
|
||||
|
||||
let content = desc.content.clone();
|
||||
let mut marked_desc = desc.clone();
|
||||
if desc.mark == young_mark {
|
||||
let Descriptor {
|
||||
content,
|
||||
rank,
|
||||
mark: _,
|
||||
copy,
|
||||
} = desc;
|
||||
|
||||
// Mark the variable as visited before adjusting content, as it may be cyclic.
|
||||
subs.set(var, desc);
|
||||
subs.set(
|
||||
var,
|
||||
Descriptor {
|
||||
content: content.clone(),
|
||||
rank,
|
||||
mark: visit_mark,
|
||||
copy,
|
||||
},
|
||||
);
|
||||
|
||||
let max_rank = adjust_rank_content(subs, young_mark, visit_mark, group_rank, content);
|
||||
marked_desc.rank = max_rank;
|
||||
let max_rank =
|
||||
adjust_rank_content(subs, young_mark, visit_mark, group_rank, content.clone());
|
||||
|
||||
debug_assert_eq!(marked_desc.mark, visit_mark);
|
||||
|
||||
subs.set(var, marked_desc);
|
||||
subs.set(
|
||||
var,
|
||||
Descriptor {
|
||||
content,
|
||||
rank: max_rank,
|
||||
mark: visit_mark,
|
||||
copy,
|
||||
},
|
||||
);
|
||||
|
||||
max_rank
|
||||
} else if mark == visit_mark {
|
||||
} else if desc.mark == visit_mark {
|
||||
// nothing changes
|
||||
desc.rank
|
||||
} else {
|
||||
let mut desc = desc;
|
||||
|
||||
let min_rank = group_rank.min(desc.rank);
|
||||
|
||||
// TODO from elm-compiler: how can min_rank ever be group_rank?
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue