aboutsummaryrefslogtreecommitdiff
path: root/toplevel
diff options
context:
space:
mode:
authormsozeau2008-01-18 19:41:43 +0000
committermsozeau2008-01-18 19:41:43 +0000
commitc2e3d63ca60b27abb5398ecbc8ebcaf8fb925206 (patch)
treef0a1603b98484520e841283140817bc783d86a37 /toplevel
parentf57b2e6cf26316ec7df340ab95399039dae5143e (diff)
Fix bug #1778, better typeclass error messages. Move Obligations Tactic to a wrapper around Ltac program_simpl ::= .
!!!! This may introduce incompatibilities because now modifications of program_simpl are properly handled and work across modules. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10454 85f007b7-540e-0410-9357-904b9bb8a0f7
Diffstat (limited to 'toplevel')
-rw-r--r--toplevel/himsg.ml23
1 files changed, 20 insertions, 3 deletions
diff --git a/toplevel/himsg.ml b/toplevel/himsg.ml
index 784346b244..0b69c41e79 100644
--- a/toplevel/himsg.ml
+++ b/toplevel/himsg.ml
@@ -343,8 +343,25 @@ let explain_not_clean env ev t k =
str "with a term using variable " ++ var ++ spc () ++
str "which is not in its scope."
-let explain_unsolvable_implicit env k =
- str "Cannot infer " ++ explain_hole_kind env k ++ str "."
+let pr_ne_context_of header footer env =
+ if Environ.rel_context env = empty_rel_context &
+ Environ.named_context env = empty_named_context then footer
+ else pr_ne_context_of header env
+
+let explain_typeclass_resolution env evi k =
+ match k with
+ InternalHole | ImplicitArg _ ->
+ (match Typeclasses.class_of_constr evi.evar_concl with
+ | Some c ->
+ let env = Evd.evar_env evi in
+ str"." ++ fnl () ++ str "Could not find an instance for " ++
+ pr_lconstr_env env evi.evar_concl ++
+ pr_ne_context_of (str " in environment:"++ fnl ()) (str ".") env
+ | None -> str ".")
+ | _ -> str "."
+
+let explain_unsolvable_implicit env evi k =
+ str "Cannot infer " ++ explain_hole_kind env k ++ explain_typeclass_resolution env evi k
let explain_var_not_found env id =
str "The variable" ++ spc () ++ pr_id id ++
@@ -432,7 +449,7 @@ let explain_pretype_error env err =
| CantFindCaseType c -> explain_cant_find_case_type env c
| OccurCheck (n,c) -> explain_occur_check env n c
| NotClean (n,c,k) -> explain_not_clean env n c k
- | UnsolvableImplicit k -> explain_unsolvable_implicit env k
+ | UnsolvableImplicit (evi,k) -> explain_unsolvable_implicit env evi k
| VarNotFound id -> explain_var_not_found env id
| UnexpectedType (actual,expect) -> explain_unexpected_type env actual expect
| NotProduct c -> explain_not_product env c