Skip to content

Commit e8a067a

Browse files
committed
Use new warning API to provide nicer printer for bad relevance warning
1 parent e54723c commit e8a067a

File tree

5 files changed

+57
-21
lines changed

5 files changed

+57
-21
lines changed

kernel/typeops.ml

+23-12
Original file line numberDiff line numberDiff line change
@@ -57,26 +57,37 @@ let infer_assumption env t ty =
5757
with TypeError _ ->
5858
error_assumption env (make_judge t ty)
5959

60-
type bad_relevance =
61-
| BadRelevanceBinder of Sorts.relevance * rel_declaration
62-
| BadRelevanceCase of Sorts.relevance * Constr.t
60+
type ('constr,'types) bad_relevance =
61+
| BadRelevanceBinder of Sorts.relevance * ('constr,'types) Context.Rel.Declaration.pt
62+
| BadRelevanceCase of Sorts.relevance * 'constr
6363

6464
let warn_bad_relevance_name = "bad-relevance"
65-
let warn_bad_relevance =
66-
CWarnings.create ~name:warn_bad_relevance_name ~default:CWarnings.AsError
67-
Pp.(function
68-
| BadRelevanceCase _ -> str "Bad relevance in case annotation."
69-
| BadRelevanceBinder (_, na) -> str "Bad relevance for binder " ++ Name.print (RelDecl.get_name na) ++ str ".")
7065

71-
let warn_bad_relevance_case ?loc env rlv case = match CWarnings.get_status ~name:warn_bad_relevance_name with
66+
let bad_relevance_warning =
67+
CWarnings.create_warning ~name:warn_bad_relevance_name ~default:CWarnings.AsError ()
68+
69+
let bad_relevance_msg = CWarnings.create_msg bad_relevance_warning ()
70+
71+
let default_print_bad_relevance = function
72+
| BadRelevanceCase _ -> Pp.str "Bad relevance in case annotation."
73+
| BadRelevanceBinder (_, na) ->
74+
Pp.(str "Bad relevance for binder " ++ Name.print (RelDecl.get_name na) ++ str ".")
75+
76+
(* used eg in the checker *)
77+
let () = CWarnings.register_printer bad_relevance_msg
78+
(fun (_env,b) -> default_print_bad_relevance b)
79+
80+
let warn_bad_relevance_case ?loc env rlv case =
81+
match CWarnings.warning_status bad_relevance_warning with
7282
| CWarnings.Disabled | CWarnings.Enabled ->
73-
warn_bad_relevance ?loc (BadRelevanceCase (rlv, mkCase case))
83+
CWarnings.warn bad_relevance_msg ?loc (env, BadRelevanceCase (rlv, mkCase case))
7484
| CWarnings.AsError ->
7585
error_bad_case_relevance env rlv case
7686

77-
let warn_bad_relevance_binder ?loc env rlv bnd = match CWarnings.get_status ~name:warn_bad_relevance_name with
87+
let warn_bad_relevance_binder ?loc env rlv bnd =
88+
match CWarnings.warning_status bad_relevance_warning with
7889
| CWarnings.Disabled | CWarnings.Enabled ->
79-
warn_bad_relevance ?loc (BadRelevanceBinder (rlv, bnd))
90+
CWarnings.warn bad_relevance_msg ?loc (env, BadRelevanceBinder (rlv, bnd))
8091
| CWarnings.AsError ->
8192
error_bad_binder_relevance env rlv bnd
8293

kernel/typeops.mli

+9-6
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,15 @@ val type_of_prim_or_type : env -> Univ.Instance.t -> CPrimitives.op_or_type -> t
124124
val warn_bad_relevance_name : string
125125
(** Allow the checker to make this warning into an error. *)
126126

127-
val warn_bad_relevance_binder
128-
: ?loc:Loc.t
129-
-> Environ.env
130-
-> Sorts.relevance
131-
-> Constr.rel_declaration
132-
-> unit
127+
val bad_relevance_warning : CWarnings.warning
128+
(** Also used by the pretyper to define a message which uses the evar map. *)
129+
130+
type ('constr,'types) bad_relevance =
131+
| BadRelevanceBinder of Sorts.relevance * ('constr,'types) Context.Rel.Declaration.pt
132+
| BadRelevanceCase of Sorts.relevance * 'constr
133+
134+
val bad_relevance_msg : (env * (constr,types) bad_relevance) CWarnings.msg
135+
(** Used by the higher layers to register a nicer printer than the default. *)
133136

134137
val should_invert_case : env -> case_info -> bool
135138
(** We have case inversion exactly when going from irrelevant nonempty

pretyping/typing.ml

+6-3
Original file line numberDiff line numberDiff line change
@@ -375,10 +375,13 @@ let judge_of_array env sigma u tj defj tyj =
375375
in
376376
sigma, j
377377

378-
let warn_bad_relevance_binder ?loc env sigma rlv bnd = match CWarnings.get_status ~name:Typeops.warn_bad_relevance_name with
378+
let bad_relevance_msg = CWarnings.create_msg Typeops.bad_relevance_warning ()
379+
(* no need for default printer, pretyping is always linked with himsg in practice *)
380+
381+
let warn_bad_relevance_binder ?loc env sigma rlv bnd =
382+
match CWarnings.warning_status Typeops.bad_relevance_warning with
379383
| CWarnings.Disabled | CWarnings.Enabled ->
380-
let bnd = Rel.Declaration.map_constr_het EConstr.Unsafe.to_constr bnd in
381-
Typeops.warn_bad_relevance_binder ?loc env rlv bnd
384+
CWarnings.warn bad_relevance_msg ?loc (env,sigma,Typeops.BadRelevanceBinder (rlv, bnd))
382385
| CWarnings.AsError ->
383386
CErrors.anomaly (CErrors.print (PretypeError (env, sigma, TypingError (Type_errors.BadBinderRelevance (rlv, bnd)))))
384387

pretyping/typing.mli

+2
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,5 @@ val checked_applist : env -> evar_map -> constr -> constr list -> evar_map * con
7070

7171
(** hack *)
7272
val recheck_against : Environ.env -> evar_map -> constr -> constr -> evar_map * types
73+
74+
val bad_relevance_msg : (Environ.env * evar_map * (constr, types) Typeops.bad_relevance) CWarnings.msg

vernac/himsg.ml

+17
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,23 @@ let explain_bad_case_relevance env sigma rlv case =
808808
strbrk " but was expected to be " ++ pr_relevance sigma rlv ++
809809
spc () ++ str "(maybe a bugged tactic)."
810810

811+
let explain_bad_relevance env sigma = function
812+
| Typeops.BadRelevanceCase (r,c) -> explain_bad_case_relevance env sigma r c
813+
| BadRelevanceBinder (r,d) -> explain_bad_binder_relevance env sigma r d
814+
815+
let ecast_bad_relevance = let open Typeops in function
816+
| BadRelevanceCase (r,c) -> BadRelevanceCase (r, EConstr.of_constr c)
817+
| BadRelevanceBinder (r,d) -> BadRelevanceBinder (r, RelDecl.map_constr_het EConstr.of_constr d)
818+
819+
let () =
820+
CWarnings.register_printer Typeops.bad_relevance_msg
821+
(fun (env, b) ->
822+
let sigma = Evd.from_env env in
823+
explain_bad_relevance env sigma (ecast_bad_relevance b))
824+
825+
let () = CWarnings.register_printer Typing.bad_relevance_msg
826+
(fun (env, sigma, b) -> explain_bad_relevance env sigma b)
827+
811828
let explain_bad_invert env =
812829
strbrk "Bad case inversion (maybe a bugged tactic)."
813830

0 commit comments

Comments
 (0)