Merge pull request #4579 from roc-lang/underivable-rigid-better-error

Suggest binding type variables to an ability when they're unsatisfied
This commit is contained in:
Richard Feldman 2022-11-25 19:46:11 -05:00 committed by GitHub
commit 791025d3ed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 2 deletions

View file

@ -502,7 +502,7 @@ trait DerivableVisitor {
if abilities != [Self::ABILITY] {
Err(NotDerivable {
var,
context: NotDerivableContext::NoContext,
context: NotDerivableContext::UnboundVar,
})
} else {
Ok(())
@ -634,7 +634,7 @@ trait DerivableVisitor {
RigidVar(_) => {
return Err(NotDerivable {
var,
context: NotDerivableContext::NoContext,
context: NotDerivableContext::UnboundVar,
})
}
FlexAbleVar(opt_name, abilities) => {

View file

@ -12421,6 +12421,39 @@ All branches in an `if` must have the same type!
"###
);
test_report!(
suggest_binding_rigid_var_to_ability,
indoc!(
r#"
app "test" provides [f] to "./p"
f : List e -> List e
f = \l -> if l == l then l else l
"#
),
@r###"
TYPE MISMATCH /code/proj/Main.roc
This expression has a type that does not implement the abilities it's expected to:
4 f = \l -> if l == l then l else l
^
I can't generate an implementation of the `Eq` ability for
List e
In particular, an implementation for
e
cannot be generated.
Tip: This type variable is not bound to `Eq`. Consider adding a `has`
clause to bind the type variable, like `| e has Bool.Eq`
"###
);
test_report!(
crash_given_non_string,
indoc!(