@@ -37,6 +37,12 @@ data UResult a = UOK a
3737 | UPartOK a
3838 | UFail Err
3939
40+-- | Smart constructor for unification errors that takes into account the FailContext
41+cantUnify :: [FailContext] -> Bool -> t -> t -> (Err' t) -> [(Name, t)] -> Int -> Err' t
42+cantUnify [] r t1 t2 e ctxt i = CantUnify r t1 t2 e ctxt i
43+cantUnify (FailContext fc f x : _) r t1 t2 e ctxt i =
44+ ElaboratingArg fc f x (CantUnify r t1 t2 e ctxt i)
45+
4046-- Solve metavariables by matching terms against each other
4147-- Not really unification, of course!
4248
@@ -89,7 +95,7 @@ match_unify ctxt env topx topy inj holes from =
8995 | OK True <- convEq' ctxt holes x y = do sc 1; return []
9096 | otherwise = do UI s f <- get
9197 let r = recoverable x y
92− let err = CantUnify r
98+ let err = cantUnify from r
9399 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
94100 if (not r) then lift $ tfail err
95101 else do put (UI s ((x, y, env, err, from, Match) : f))
@@ -103,9 +109,9 @@ match_unify ctxt env topx topy inj holes from =
103109 uB bnames (Pi tx) (Pi ty) = un bnames tx ty
104110 uB bnames x y = do UI s f <- get
105111 let r = recoverable (binderTy x) (binderTy y)
106− let err = CantUnify r topx topy
107− (CantUnify r (binderTy x) (binderTy y) (Msg "") (errEnv env) s)
108− (errEnv env) s
112+ let err = cantUnify from r topx topy
113+ (CantUnify r (binderTy x) (binderTy y) (Msg "") (errEnv env) s)
114+ (errEnv env) s
109115 put (UI s ((binderTy x, binderTy y, env, err, from, Match) : f))
110116 return []
111117
@@ -117,7 +123,7 @@ match_unify ctxt env topx topy inj holes from =
117123
118124 unifyFail x y = do UI s f <- get
119125 let r = recoverable x y
120− let err = CantUnify r
126+ let err = cantUnify from r
121127 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
122128 put (UI s ((x, y, env, err, from, Match) : f))
123129 lift $ tfail err
@@ -370,7 +376,7 @@ unify ctxt env topx topy inj holes from =
370376 | OK True <- convEq' ctxt holes x y = do sc 1; return []
371377 | otherwise = do UI s f <- get
372378 let r = recoverable x y
373− let err = CantUnify r
379+ let err = cantUnify from r
374380 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
375381 if (not r) then lift $ tfail err
376382 else do put (UI s ((x, y, env, err, from, Unify) : f))
@@ -470,7 +476,7 @@ unify ctxt env topx topy inj holes from =
470476 unifyTmpFail x y
471477 = do UI s f <- get
472478 let r = recoverable x y
473− let err = CantUnify r
479+ let err = cantUnify from r
474480 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
475481 put (UI s ((topx, topy, env, err, from, Unify) : f))
476482 return []
@@ -478,7 +484,7 @@ unify ctxt env topx topy inj holes from =
478484 -- shortcut failure, if we *know* nothing can fix it
479485 unifyFail x y = do UI s f <- get
480486 let r = recoverable x y
481− let err = CantUnify r
487+ let err = cantUnify from r
482488 topx topy (CantUnify r x y (Msg "") (errEnv env) s) (errEnv env) s
483489 put (UI s ((topx, topy, env, err, from, Unify) : f))
484490 lift $ tfail err
@@ -500,9 +506,9 @@ unify ctxt env topx topy inj holes from =
500506 uB bnames (PVar tx) (PVar ty) = un' False bnames tx ty
501507 uB bnames x y = do UI s f <- get
502508 let r = recoverable (binderTy x) (binderTy y)
503− let err = CantUnify r topx topy
504− (CantUnify r (binderTy x) (binderTy y) (Msg "") (errEnv env) s)
505− (errEnv env) s
509+ let err = cantUnify from r topx topy
510+ (CantUnify r (binderTy x) (binderTy y) (Msg "") (errEnv env) s)
511+ (errEnv env) s
506512 put (UI s ((binderTy x, binderTy y, env, err, from, Unify) : f))
507513 return [] -- lift $ tfail err
508514