fix problem with recursive definition constraint gen

This commit is contained in:
Folkert 2020-11-10 19:37:33 +01:00
parent b54c1a2194
commit 3aa6455795
7 changed files with 137 additions and 103 deletions

View file

@ -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?