@@ -490,13 +490,13 @@ data Info = Info
490490
491491
492492constrainDef :: Env.Env -> Info -> Canonical.Def -> IO Info
493−constrainDef env info (Canonical.Def _ (A.A patternRegion pattern) expr maybeTipe) =
493+constrainDef env info (Canonical.Def defRegion (A.A patternRegion pattern) expr maybeTipe) =
494494 case (pattern, maybeTipe) of
495495 (P.Var name, Nothing) ->
496496 constrainUnannotatedDef env patternRegion name expr info
497497
498498 (P.Var name, Just (A.A _ tipe)) ->
499− constrainAnnotatedDef env patternRegion name expr tipe info
499+ constrainAnnotatedDef env defRegion patternRegion name expr tipe info
500500
501501 _ ->
502502 error "canonical definitions must not have complex patterns as names in the contstraint generation phase"
@@ -520,8 +520,16 @@ constrainUnannotatedDef env patternRegion name expr info =
520520 }
521521
522522
523−constrainAnnotatedDef :: Env.Env -> R.Region -> String -> Canonical.Expr -> ST.Canonical -> Info -> IO Info
524−constrainAnnotatedDef env region name expr tipe info =
523+constrainAnnotatedDef
524+ :: Env.Env
525+ -> R.Region
526+ -> R.Region
527+ -> String
528+ -> Canonical.Expr
529+ -> ST.Canonical
530+ -> Info
531+ -> IO Info
532+constrainAnnotatedDef env defRegion region name expr tipe info =
525533 do (flexType, flexVars) <- Env.instantiateType Flex env tipe
526534
527535 let scheme =
@@ -532,7 +540,7 @@ constrainAnnotatedDef env region name expr tipe info =
532540 , _header = Map.singleton name (A.A region flexType)
533541 }
534542
535− defCon <- constrainAnnDefHelp name expr tipe (ArgInfo env [] [])
543+ defCon <- constrainAnnDefHelp expr tipe (ArgInfo name defRegion env [] [])
536544
537545 return $ info
538546 { iSchemes = scheme : iSchemes info
@@ -542,21 +550,25 @@ constrainAnnotatedDef env region name expr tipe info =
542550
543551data ArgInfo =
544552 ArgInfo
545− { _env :: Env.Env
553+ { _name :: String
554+ , _def :: R.Region
555+ , _env :: Env.Env
546556 , _args :: [(P.Canonical, Type)]
547557 , _vars :: [Variable]
548558 }
549559
550560
551−constrainAnnDefHelp :: String -> Canonical.Expr -> ST.Canonical -> ArgInfo -> IO TypeConstraint
552−constrainAnnDefHelp name expr tipe (ArgInfo env args vars) =
561+constrainAnnDefHelp :: Canonical.Expr -> ST.Canonical -> ArgInfo -> IO TypeConstraint
562+constrainAnnDefHelp expr tipe (ArgInfo name defRegion env args vars) =
553563 case (expr, tipe) of
554564 (A.A _ (E.Lambda arg result), ST.Lambda argType resultType) ->
555565 do (rigidArgType, newVars) <- Env.instantiateType Rigid env argType
556566
557− constrainAnnDefHelp name result resultType $
567+ constrainAnnDefHelp result resultType $
558568 ArgInfo
559− { _env = Env.addValues newVars env
569+ { _name = name
570+ , _def = defRegion
571+ , _env = Env.addValues newVars env
560572 , _args = (arg, rigidArgType) : args
561573 , _vars = Map.elems newVars ++ vars
562574 }
@@ -574,8 +586,13 @@ constrainAnnDefHelp name expr tipe (ArgInfo env args vars) =
574586 resultVar <- mkVar Nothing
575587 let resultType = VarN resultVar
576588 defCon <- constrain finalEnv expr resultType
589+
590+ let sharedArity = length args
591+ let typeArity = sharedArity + length (ST.collectLambdas tipe) - 1
592+ let argsArity = sharedArity + length (fst (E.collectLambdas expr))
593+ let hint = Error.ReturnType name typeArity argsArity region
577594 let resultCon =
578− CEqual (Error.ReturnType name (length args)) region resultType rigidType
595+ CEqual hint defRegion rigidType resultType
579596
580597 return $ forall rigidVars $ ex (resultVar : argVars) $ CLet [monoscheme headers] $
581598 CAnd [ argCons, defCon, resultCon ]