mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-02 00:01:16 +00:00
fix alias instantiation problem
This commit is contained in:
parent
01dfda29b0
commit
c9426e2ed2
2 changed files with 30 additions and 3 deletions
|
@ -1717,7 +1717,15 @@ fn correct_mutual_recursive_type_alias<'a>(
|
||||||
let capacity = original_aliases.len();
|
let capacity = original_aliases.len();
|
||||||
let mut matrix = ReferenceMatrix::new(capacity);
|
let mut matrix = ReferenceMatrix::new(capacity);
|
||||||
|
|
||||||
let (symbols_introduced, mut aliases) = original_aliases.unzip();
|
// It is important that we instantiate with the aliases as they occur in the source.
|
||||||
|
// We must not instantiate A into B, then use the updated B to instantiate into C
|
||||||
|
//
|
||||||
|
// That is because B could be used different places. We don't want one place
|
||||||
|
// to mess with another.
|
||||||
|
let (symbols_introduced, uninstantiated_aliases) = original_aliases.unzip();
|
||||||
|
|
||||||
|
// the aliases that we will instantiate into
|
||||||
|
let mut aliases = uninstantiated_aliases.clone();
|
||||||
|
|
||||||
for (index, alias) in aliases.iter().enumerate() {
|
for (index, alias) in aliases.iter().enumerate() {
|
||||||
for referenced in alias.typ.symbols() {
|
for referenced in alias.typ.symbols() {
|
||||||
|
@ -1765,7 +1773,9 @@ fn correct_mutual_recursive_type_alias<'a>(
|
||||||
std::mem::swap(&mut alias_type, &mut aliases[index].typ);
|
std::mem::swap(&mut alias_type, &mut aliases[index].typ);
|
||||||
|
|
||||||
let can_instantiate_symbol = |s| match symbols_introduced.iter().position(|i| *i == s) {
|
let can_instantiate_symbol = |s| match symbols_introduced.iter().position(|i| *i == s) {
|
||||||
Some(s_index) if to_instantiate_bitvec[s_index] => aliases.get(s_index),
|
Some(s_index) if to_instantiate_bitvec[s_index] => {
|
||||||
|
uninstantiated_aliases.get(s_index)
|
||||||
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5297,7 +5297,24 @@ mod solve_expr {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn issue_2458() {
|
fn issue_2458() {
|
||||||
// TODO: the order of the alias definitions matters
|
infer_eq_without_problem(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
Foo a : [ Blah (Result (Bar a) { val: a }) ]
|
||||||
|
Bar a : Foo a
|
||||||
|
|
||||||
|
v : Bar U8
|
||||||
|
v = Blah (Ok (Blah (Err { val: 1 })))
|
||||||
|
|
||||||
|
v
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
"Bar U8",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn issue_2458_swapped_order() {
|
||||||
infer_eq_without_problem(
|
infer_eq_without_problem(
|
||||||
indoc!(
|
indoc!(
|
||||||
r#"
|
r#"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue