From a431af660d822a23cbc90c9dd2af8c3cc134334d Mon Sep 17 00:00:00 2001 From: Folkert Date: Thu, 12 Nov 2020 22:28:58 +0100 Subject: [PATCH] give better debug info for unresolved type variables --- compiler/mono/src/ir.rs | 10 +++++++++- compiler/mono/src/layout.rs | 16 +++++++++++++--- examples/effect/Main.roc | 15 ++++++++++++--- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/compiler/mono/src/ir.rs b/compiler/mono/src/ir.rs index 26eae7b0ee..02441a6944 100644 --- a/compiler/mono/src/ir.rs +++ b/compiler/mono/src/ir.rs @@ -4615,7 +4615,15 @@ fn reuse_function_symbol<'a>( original: Symbol, ) -> Stmt<'a> { match procs.partial_procs.get(&original) { - None => result, + None => { + // danger: a foreign symbol may not be specialized! + debug_assert!( + env.home == original.module_id() || original.module_id() == ModuleId::ATTR + ); + + result + } + Some(partial_proc) => { let arg_var = arg_var.unwrap_or(partial_proc.annotation); // this symbol is a function, that is used by-name (e.g. as an argument to another diff --git a/compiler/mono/src/layout.rs b/compiler/mono/src/layout.rs index c94aaf4f7f..60df52a6bf 100644 --- a/compiler/mono/src/layout.rs +++ b/compiler/mono/src/layout.rs @@ -315,7 +315,10 @@ impl<'a> Layout<'a> { match content { FlexVar(_) | RigidVar(_) => Err(LayoutProblem::UnresolvedTypeVar(var)), - RecursionVar { .. } => todo!("recursion var"), + RecursionVar { structure, .. } => { + let structure_content = env.subs.get_without_compacting(structure).content; + Self::new_help(env, structure, structure_content) + } Structure(flat_type) => layout_from_flat_type(env, flat_type), Alias(Symbol::NUM_INT, args, _) => { @@ -751,7 +754,7 @@ fn layout_from_flat_type<'a>( // Determine the layouts of the fields, maintaining sort order let mut layouts = Vec::with_capacity_in(sorted_fields.len(), arena); - for (_, field) in sorted_fields { + for (label, field) in sorted_fields { use LayoutProblem::*; let field_var = { @@ -776,7 +779,14 @@ fn layout_from_flat_type<'a>( layouts.push(layout); } } - Err(UnresolvedTypeVar(_)) | Err(Erroneous) => { + Err(UnresolvedTypeVar(v)) => { + // Invalid field! + panic!( + r"I hit an unresolved type var {:?} when determining the layout of {:?} of record field: {:?} : {:?}", + field_var, v, label, field + ); + } + Err(Erroneous) => { // Invalid field! panic!("TODO gracefully handle record with invalid field.var"); } diff --git a/examples/effect/Main.roc b/examples/effect/Main.roc index 0969b878ce..92294982b5 100644 --- a/examples/effect/Main.roc +++ b/examples/effect/Main.roc @@ -1,12 +1,21 @@ app Main provides [ main ] imports [ Effect, RBTree ] -foo : RBTree.Dict Int Int -foo = Empty # RBTree.empty +toAndFro : Int +toAndFro = + empty : RBTree.Dict Int Int + empty = RBTree.empty + + empty + |> RBTree.toList + |> List.len + + + main : Effect.Effect {} as Fx main = # if RBTree.isEmpty empty then - if RBTree.size foo == 0 then + if toAndFro == 2 then Effect.putLine "Yay" |> Effect.after (\{} -> Effect.getLine) |> Effect.after (\line -> Effect.putLine line)