aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--pretyping/evarsolve.ml10
-rw-r--r--pretyping/pretype_errors.ml1
-rw-r--r--pretyping/pretype_errors.mli1
-rw-r--r--toplevel/himsg.ml67
4 files changed, 49 insertions, 30 deletions
diff --git a/pretyping/evarsolve.ml b/pretyping/evarsolve.ml
index 0e1ecda5c..c62d56790 100644
--- a/pretyping/evarsolve.ml
+++ b/pretyping/evarsolve.ml
@@ -1497,10 +1497,14 @@ let status_changed lev (pbty,_,t1,t2) =
let reconsider_conv_pbs conv_algo evd =
let (evd,pbs) = extract_changed_conv_pbs evd status_changed in
List.fold_left
- (fun p (pbty,env,t1,t2) ->
+ (fun p (pbty,env,t1,t2 as x) ->
match p with
- | Success evd -> conv_algo env evd pbty t1 t2
- | UnifFailure _ as x -> x) (Success evd)
+ | Success evd ->
+ (match conv_algo env evd pbty t1 t2 with
+ | Success _ as x -> x
+ | UnifFailure (i,e) -> UnifFailure (i,CannotSolveConstraint (x,e)))
+ | UnifFailure _ as x -> x)
+ (Success evd)
pbs
(* Tries to solve problem t1 = t2.
diff --git a/pretyping/pretype_errors.ml b/pretyping/pretype_errors.ml
index 9b5b79284..21604a8fc 100644
--- a/pretyping/pretype_errors.ml
+++ b/pretyping/pretype_errors.ml
@@ -22,6 +22,7 @@ type unification_error =
| MetaOccurInBody of existential_key
| InstanceNotSameType of existential_key * env * types * types
| UnifUnivInconsistency of Univ.univ_inconsistency
+ | CannotSolveConstraint of Evd.evar_constraint * unification_error
type position = (Id.t * Locus.hyp_location_flag) option
diff --git a/pretyping/pretype_errors.mli b/pretyping/pretype_errors.mli
index 122240621..741279a51 100644
--- a/pretyping/pretype_errors.mli
+++ b/pretyping/pretype_errors.mli
@@ -23,6 +23,7 @@ type unification_error =
| MetaOccurInBody of existential_key
| InstanceNotSameType of existential_key * env * types * types
| UnifUnivInconsistency of Univ.univ_inconsistency
+ | CannotSolveConstraint of Evd.evar_constraint * unification_error
type position = (Id.t * Locus.hyp_location_flag) option
diff --git a/toplevel/himsg.ml b/toplevel/himsg.ml
index d16029400..8a9282d1b 100644
--- a/toplevel/himsg.ml
+++ b/toplevel/himsg.ml
@@ -56,7 +56,7 @@ let contract1_vect env a v =
| env, a::l -> env,a,Array.of_list l
| _ -> assert false
-let contract3' env a b c = function
+let rec contract3' env a b c = function
| OccurCheck (evk,d) -> let x,d = contract4 env a b c d in x,OccurCheck(evk,d)
| NotClean ((evk,args),env',d) ->
let env',d,args = contract1_vect env' d args in
@@ -67,6 +67,10 @@ let contract3' env a b c = function
| NotSameArgSize | NotSameHead | NoCanonicalStructure
| MetaOccurInBody _ | InstanceNotSameType _
| UnifUnivInconsistency _ as x -> contract3 env a b c, x
+ | CannotSolveConstraint ((pb,env,t,u),x) ->
+ let env,t,u = contract2 env t u in
+ let y,x = contract3' env a b c x in
+ y,CannotSolveConstraint ((pb,env,t,u),x)
(** Printers *)
@@ -259,49 +263,58 @@ let explain_generalization env sigma (name,var) j =
let explain_unification_error env sigma p1 p2 = function
| None -> mt()
| Some e ->
- match e with
- | OccurCheck (evk,rhs) ->
+ let rec aux = function
+ | OccurCheck (evk,rhs) ->
let rhs = Evarutil.nf_evar sigma rhs in
- spc () ++ str "(cannot define " ++ quote (pr_existential_key sigma evk) ++
+ [str "cannot define " ++ quote (pr_existential_key sigma evk) ++
strbrk " with term " ++ pr_lconstr_env env sigma rhs ++
- strbrk " that would depend on itself)"
- | NotClean ((evk,args),env,c) ->
+ strbrk " that would depend on itself"]
+ | NotClean ((evk,args),env,c) ->
let c = Evarutil.nf_evar sigma c in
let args = Array.map (Evarutil.nf_evar sigma) args in
- spc () ++ str "(cannot instantiate " ++ quote (pr_existential_key sigma evk)
+ [str "cannot instantiate " ++ quote (pr_existential_key sigma evk)
++ strbrk " because " ++ pr_lconstr_env env sigma c ++
strbrk " is not in its scope" ++
(if Array.is_empty args then mt() else
strbrk ": available arguments are " ++
- pr_sequence (pr_lconstr_env env sigma) (List.rev (Array.to_list args))) ++
- str ")"
- | NotSameArgSize | NotSameHead | NoCanonicalStructure ->
- (* Error speaks from itself *) mt ()
- | ConversionFailed (env,t1,t2) ->
- if Term.eq_constr t1 p1 && Term.eq_constr t2 p2 then mt () else
+ pr_sequence (pr_lconstr_env env sigma) (List.rev (Array.to_list args)))]
+ | NotSameArgSize | NotSameHead | NoCanonicalStructure ->
+ (* Error speaks from itself *) []
+ | ConversionFailed (env,t1,t2) ->
+ if Term.eq_constr t1 p1 && Term.eq_constr t2 p2 then [] else
let env = make_all_name_different env in
let t1 = Evarutil.nf_evar sigma t1 in
let t2 = Evarutil.nf_evar sigma t2 in
if not (Term.eq_constr t1 p1) || not (Term.eq_constr t2 p2) then
let t1, t2 = pr_explicit env sigma t1 t2 in
- spc () ++ str "(cannot unify " ++ t1 ++ strbrk " and " ++
- t2 ++ str ")"
- else mt ()
- | MetaOccurInBody evk ->
- spc () ++ str "(instance for " ++ quote (pr_existential_key sigma evk) ++
- strbrk " refers to a metavariable - please report your example)"
- | InstanceNotSameType (evk,env,t,u) ->
+ [str "cannot unify " ++ t1 ++ strbrk " and " ++ t2]
+ else []
+ | MetaOccurInBody evk ->
+ [str "instance for " ++ quote (pr_existential_key sigma evk) ++
+ strbrk " refers to a metavariable - please report your example"]
+ | InstanceNotSameType (evk,env,t,u) ->
let t, u = pr_explicit env sigma t u in
- spc () ++ str "(unable to find a well-typed instantiation for " ++
+ [str "unable to find a well-typed instantiation for " ++
quote (pr_existential_key sigma evk) ++
strbrk ": cannot ensure that " ++
- t ++ strbrk " is a subtype of " ++ u ++ str ")"
- | UnifUnivInconsistency p ->
+ t ++ strbrk " is a subtype of " ++ u]
+ | UnifUnivInconsistency p ->
if !Constrextern.print_universes then
- spc () ++ str "(Universe inconsistency: " ++
- Univ.explain_universe_inconsistency p ++ str")"
+ [str "universe inconsistency: " ++
+ Univ.explain_universe_inconsistency p]
else
- spc () ++ str "(Universe inconsistency)"
+ [str "universe inconsistency"]
+ | CannotSolveConstraint ((pb,env,t,u),e) ->
+ let t = Evarutil.nf_evar sigma t in
+ let u = Evarutil.nf_evar sigma u in
+ (strbrk "cannot satisfy constraint " ++ pr_lconstr_env env sigma t ++
+ str " == " ++ pr_lconstr_env env sigma u)
+ :: aux e
+ in
+ match aux e with
+ | [] -> mt ()
+ | l -> spc () ++ str "(" ++
+ prlist_with_sep pr_semicolon (fun x -> x) l ++ str ")"
let explain_actual_type env sigma j t reason =
let env = make_all_name_different env in
@@ -499,7 +512,7 @@ let pr_trailing_ne_context_of env sigma =
if List.is_empty (Environ.rel_context env) &&
List.is_empty (Environ.named_context env)
then str "."
- else (str " in environment:"++ fnl () ++ pr_context_unlimited env sigma)
+ else (str " in environment:"++ pr_context_unlimited env sigma)
let rec explain_evar_kind env sigma evk ty = function
| Evar_kinds.QuestionMark _ ->