diff --git a/crates/compiler/solve/src/solve.rs b/crates/compiler/solve/src/solve.rs index d6f5855dfa..8850b98b31 100644 --- a/crates/compiler/solve/src/solve.rs +++ b/crates/compiler/solve/src/solve.rs @@ -3040,7 +3040,6 @@ fn type_to_variable<'a>( alias_variable, AliasKind::Structural, ); - // let result = register(subs, rank, pools, content); let result = register_with_known_var(subs, destination, rank, pools, content); // We only want to unify the actual_var with the alias once @@ -3054,7 +3053,11 @@ fn type_to_variable<'a>( result } Erroneous => { - let content = Content::Error; + // TODO: remove `Erroneous`, `Error` can always be used, and type problems known at + // this point can be reported during canonicalization. + let problem_index = + SubsIndex::push_new(&mut subs.problems, types.get_problem(&typ).clone()); + let content = Content::Structure(FlatType::Erroneous(problem_index)); register_with_known_var(subs, destination, rank, pools, content) } diff --git a/crates/compiler/types/src/types.rs b/crates/compiler/types/src/types.rs index 510116c15e..fa8ffd3db4 100644 --- a/crates/compiler/types/src/types.rs +++ b/crates/compiler/types/src/types.rs @@ -417,6 +417,7 @@ pub enum TypeTag { Variable(Variable), RangedNumber(NumericRange), /// A type error, which will code gen to a runtime error + /// The problem is at the index of the type tag Erroneous, // TypeExtension is implicit in the type slice @@ -507,6 +508,11 @@ impl Types { .expect("typ is not a single tag union") } + #[track_caller] + pub fn get_problem(&self, typ: &Index) -> &Problem { + self.problems.get(typ).expect("typ is not an error") + } + pub fn record_fields_slices( &self, fields: RecordFields,