@@ -416,12 +416,12 @@ data Info = Info
418constrainDef :: Env.Environment -> Info -> Canonical.Def -> IO Info
418constrainDef :: Env.Environment -> Info -> Canonical.Def -> IO Info
419−constrainDef env info (Canonical.Definition (A.A _ pattern) expr maybeTipe) =
419+constrainDef env info (Canonical.Definition (A.A region pattern) expr maybeTipe) =
420 let qs = [] -- should come from the def, but I'm not sure what would live there...
420 let qs = [] -- should come from the def, but I'm not sure what would live there...
422 case (pattern, maybeTipe) of
422 case (pattern, maybeTipe) of
423 (P.Var name, Just tipe) ->
423 (P.Var name, Just tipe) ->
424− constrainAnnotatedDef env info qs name expr tipe
424+ constrainAnnotatedDef env info qs region name expr tipe
426 (P.Var name, Nothing) ->
426 (P.Var name, Nothing) ->
427 constrainUnannotatedDef env info qs name expr
427 constrainUnannotatedDef env info qs name expr
@@ -433,11 +433,12 @@ constrainAnnotatedDef
433 :: Env.Environment
433 :: Env.Environment
435 -> [String]
435 -> [String]
436 -> String
437 -> String
437 -> Canonical.Expr
438 -> Canonical.Expr
438 -> ST.Canonical
439 -> ST.Canonical
439 -> IO Info
440 -> IO Info
440−constrainAnnotatedDef env info qs name expr tipe =
441+constrainAnnotatedDef env info qs region name expr tipe =
441 do -- Some mistake may be happening here. Currently, qs is always [].
442 do -- Some mistake may be happening here. Currently, qs is always [].
442 rigidVars <- Monad.forM qs (\_ -> variable Rigid)
443 rigidVars <- Monad.forM qs (\_ -> variable Rigid)
@@ -457,11 +458,14 @@ constrainAnnotatedDef env info qs name expr tipe =
457 , header = Map.singleton name typ
458 , header = Map.singleton name typ
461+ var <- variable Flexible
460− c <- constrain env' expr typ
462+ defCon <- constrain env' expr (varN var)
464+ CEqual (Error.BadTypeAnnotation name) region typ (varN var)
462 return $ info
466 return $ info
463 { iSchemes = scheme : iSchemes info
467 { iSchemes = scheme : iSchemes info
464− , iC1 = fl rigidVars c /\ iC1 info
468+ , iC1 = iC1 info /\ ex [var] (defCon /\ fl rigidVars annCon)
@@ -484,11 +488,11 @@ constrainUnannotatedDef env info qs name expr =
485 let env' = env { Env.value = List.foldl' (\x f -> f x) (Env.value env) inserts }
489 let env' = env { Env.value = List.foldl' (\x f -> f x) (Env.value env) inserts }
487− c <- constrain env' expr tipe
491+ con <- constrain env' expr tipe
489 return $ info
493 return $ info
490 { iRigid = rigidVars ++ iRigid info
494 { iRigid = rigidVars ++ iRigid info
491 , iFlex = v : iFlex info
495 , iFlex = v : iFlex info
492 , iHeaders = Map.insert name tipe (iHeaders info)
496 , iHeaders = Map.insert name tipe (iHeaders info)
493− , iC2 = c /\ iC2 info
497+ , iC2 = con /\ iC2 info