diff --git a/crates/compiler/solve/tests/solve_expr.rs b/crates/compiler/solve/tests/solve_expr.rs index 935ae95b90..89e60d7538 100644 --- a/crates/compiler/solve/tests/solve_expr.rs +++ b/crates/compiler/solve/tests/solve_expr.rs @@ -7324,4 +7324,21 @@ mod solve_expr { "OList", ); } + + #[test] + fn rosetree_with_result_is_legal_recursive_type() { + infer_eq_without_problem( + indoc!( + r#" + Rose a : [Rose (Result (List (Rose a)) I64)] + + x : Rose I64 + x = Rose (Ok []) + + x + "# + ), + "Rose I64", + ); + } } diff --git a/crates/compiler/types/src/types.rs b/crates/compiler/types/src/types.rs index df0a5a2d32..adfd08b72a 100644 --- a/crates/compiler/types/src/types.rs +++ b/crates/compiler/types/src/types.rs @@ -1482,6 +1482,8 @@ impl Type { Type::Apply(Symbol::LIST_LIST | Symbol::SET_SET, _, _) => false, Type::Apply(..) => internal_error!("cannot chase an Apply!"), Type::Alias { .. } => internal_error!("should be dealiased"), + // Must be conservative here because we don't know what the alias expands to yet + Type::DelayedAlias(..) => false, // Non-composite types are trivially narrow _ => true, }