Skip to content

Commit a95abbe

Browse files
Merge PR rocq-prover#17585: Revised warning API: warnings can have multiple categories
Reviewed-by: proux01 Ack-by: Zimmi48 Co-authored-by: proux01 <[email protected]>
2 parents bc0545c + 68931b0 commit a95abbe

File tree

105 files changed

+786
-400
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+786
-400
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
overlay elpi https://github.com/SkySkimmer/coq-elpi warn-api 17585
2+
3+
overlay equations https://github.com/SkySkimmer/Coq-Equations warn-api 17585
4+
5+
overlay metacoq https://github.com/SkySkimmer/metacoq warn-api 17585
6+
7+
overlay quickchick https://github.com/SkySkimmer/QuickChick warn-api 17585
8+
9+
overlay smtcoq https://github.com/SkySkimmer/smtcoq warn-api 17585
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
- **Changed:**
2+
warnings can now have multiple categories allowing for finer user control on which warning to enable, disable or treat as an error
3+
(`#17585 <https://github.com/coq/coq/pull/17585>`_,
4+
by Gaëtan Gilbert).

doc/plugin_tutorial/tuto0/src/g_tuto0.mlg

+3-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ DECLARE PLUGIN "coq-plugin-tutorial.tuto0"
55
open Pp
66
open Ltac_plugin
77

8-
let tuto_warn = CWarnings.create ~name:"name" ~category:"category"
8+
let cat = CWarnings.create_category ~name:"plugin-tuto-cat" ()
9+
10+
let tuto_warn = CWarnings.create ~name:"name" ~category:cat
911
(fun _ -> strbrk Tuto0_main.message)
1012

1113
}

interp/constrintern.ml

+4-4
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ let pr_scope_stack begin_of_sentence l =
277277
str "[" ++ prlist_with_sep pr_comma str l ++ str "]"
278278

279279
let warn_inconsistent_scope =
280-
CWarnings.create ~name:"inconsistent-scopes" ~category:"syntax"
280+
CWarnings.create ~name:"inconsistent-scopes" ~category:CWarnings.CoreCategories.syntax
281281
(fun (id,scopes1,scopes2) ->
282282
(str "Argument " ++ Id.print id ++
283283
strbrk " was previously inferred to be in " ++
@@ -336,7 +336,7 @@ let mkGLambda ?loc (na,bk,t) body = DAst.make ?loc @@ GLambda (na, bk, t, body)
336336
(* Utilities for binders *)
337337

338338
let warn_shadowed_implicit_name =
339-
CWarnings.create ~name:"shadowed-implicit-name" ~category:"syntax"
339+
CWarnings.create ~name:"shadowed-implicit-name" ~category:CWarnings.CoreCategories.syntax
340340
Pp.(fun na -> str "Making shadowed name of implicit argument accessible by position.")
341341

342342
let exists_name na l =
@@ -503,7 +503,7 @@ let restore_binders_impargs env l =
503503
List.fold_right pure_push_name_env l env
504504

505505
let warn_ignoring_unexpected_implicit_binder_declaration =
506-
CWarnings.create ~name:"unexpected-implicit-declaration" ~category:"syntax"
506+
CWarnings.create ~name:"unexpected-implicit-declaration" ~category:CWarnings.CoreCategories.syntax
507507
Pp.(fun () -> str "Ignoring implicit binder declaration in unexpected position.")
508508

509509
let check_implicit_meaningful ?loc k env =
@@ -1350,7 +1350,7 @@ let intern_qualid_for_pattern test_global intern_not qid pats =
13501350
| None -> raise Not_found
13511351

13521352
let warn_nonprimitive_projection =
1353-
CWarnings.create ~name:"nonprimitive-projection-syntax" ~category:"syntax" ~default:CWarnings.Disabled
1353+
CWarnings.create ~name:"nonprimitive-projection-syntax" ~category:CWarnings.CoreCategories.syntax ~default:CWarnings.Disabled
13541354
Pp.(fun f -> pr_qualid f ++ str " used as a primitive projection but is not one.")
13551355

13561356
let error_nonprojection_syntax ?loc qid =

interp/implicit_quantifiers.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ let implicit_application env ty =
200200
CAst.make ?loc @@ CAppExpl ((id, inst), args), avoid
201201

202202
let warn_ignoring_implicit_status =
203-
CWarnings.create ~name:"ignoring_implicit_status" ~category:"implicits"
203+
CWarnings.create ~name:"ignoring-implicit-status" ~category:CWarnings.CoreCategories.implicits
204204
(fun na ->
205205
strbrk "Ignoring implicit status of product binder " ++
206206
Name.print na ++ strbrk " and following binders")

interp/notation.ml

+27-23
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ let init_scope_map () =
135135
(* Operations on scopes *)
136136

137137
let warn_undeclared_scope =
138-
CWarnings.create ~name:"undeclared-scope" ~category:"deprecated"
138+
CWarnings.create ~name:"undeclared-scope" ~category:CWarnings.CoreCategories.deprecated
139139
(fun (scope) ->
140140
strbrk "Declaring a scope implicitly is deprecated; use in advance an explicit "
141141
++ str "\"Declare Scope " ++ str scope ++ str ".\".")
@@ -685,15 +685,15 @@ module Numbers = struct
685685
open PrimTokenNotation
686686

687687
let warn_large_num =
688-
CWarnings.create ~name:"large-number" ~category:"numbers"
688+
CWarnings.create ~name:"large-number" ~category:CWarnings.CoreCategories.numbers
689689
(fun ty ->
690690
strbrk "Stack overflow or segmentation fault happens when " ++
691691
strbrk "working with large numbers in " ++ pr_qualid ty ++
692692
strbrk " (threshold may vary depending" ++
693693
strbrk " on your system limits and on the command executed).")
694694

695695
let warn_abstract_large_num =
696-
CWarnings.create ~name:"abstract-large-number" ~category:"numbers"
696+
CWarnings.create ~name:"abstract-large-number" ~category:CWarnings.CoreCategories.numbers
697697
(fun (ty,f) ->
698698
strbrk "To avoid stack overflow, large numbers in " ++
699699
pr_qualid ty ++ strbrk " are interpreted as applications of " ++
@@ -909,7 +909,7 @@ let interp_int63 ?loc esig ind n =
909909
else error_overflow ?loc n
910910

911911
let warn_inexact_float =
912-
CWarnings.create ~name:"inexact-float" ~category:"parsing"
912+
CWarnings.create ~name:"inexact-float" ~category:CWarnings.CoreCategories.parsing
913913
(fun (sn, f) ->
914914
Pp.strbrk
915915
(Printf.sprintf
@@ -1335,26 +1335,30 @@ let pr_optional_scope = function
13351335
| LastLonelyNotation -> mt ()
13361336
| NotationInScope scope -> spc () ++ strbrk "in scope" ++ spc () ++ str scope
13371337

1338+
let w_nota_overridden =
1339+
CWarnings.create_warning
1340+
~from:[CWarnings.CoreCategories.parsing] ~name:"notation-overridden" ()
1341+
13381342
let warn_notation_overridden =
1339-
CWarnings.create ~name:"notation-overridden" ~category:"parsing"
1340-
(fun (scope,ntn) ->
1341-
str "Notation" ++ spc () ++ pr_notation ntn ++ spc ()
1342-
++ strbrk "was already used" ++ pr_optional_scope scope ++ str ".")
1343+
CWarnings.create_in w_nota_overridden
1344+
(fun (scope,ntn) ->
1345+
str "Notation" ++ spc () ++ pr_notation ntn ++ spc ()
1346+
++ strbrk "was already used" ++ pr_optional_scope scope ++ str ".")
13431347

13441348
let warn_deprecation_overridden =
1345-
CWarnings.create ~name:"notation-overridden" ~category:"parsing"
1346-
(fun ((scope,ntn),old,now) ->
1347-
match old, now with
1348-
| None, None -> assert false
1349-
| None, Some _ ->
1350-
(str "Notation" ++ spc () ++ pr_notation ntn ++ pr_optional_scope scope ++ spc ()
1351-
++ strbrk "is now marked as deprecated" ++ str ".")
1352-
| Some _, None ->
1353-
(str "Cancelling previous deprecation of notation" ++ spc () ++
1354-
pr_notation ntn ++ pr_optional_scope scope ++ str ".")
1355-
| Some _, Some _ ->
1356-
(str "Amending deprecation of notation" ++ spc () ++
1357-
pr_notation ntn ++ pr_optional_scope scope ++ str "."))
1349+
CWarnings.create_in w_nota_overridden
1350+
(fun ((scope,ntn),old,now) ->
1351+
match old, now with
1352+
| None, None -> assert false
1353+
| None, Some _ ->
1354+
(str "Notation" ++ spc () ++ pr_notation ntn ++ pr_optional_scope scope ++ spc ()
1355+
++ strbrk "is now marked as deprecated" ++ str ".")
1356+
| Some _, None ->
1357+
(str "Cancelling previous deprecation of notation" ++ spc () ++
1358+
pr_notation ntn ++ pr_optional_scope scope ++ str ".")
1359+
| Some _, Some _ ->
1360+
(str "Amending deprecation of notation" ++ spc () ++
1361+
pr_notation ntn ++ pr_optional_scope scope ++ str "."))
13581362

13591363
let warn_override_if_needed (scopt,ntn) overridden data old_data =
13601364
if overridden then warn_notation_overridden (scopt,ntn)
@@ -2471,12 +2475,12 @@ let toggle_notations_in_scope ~on found inscope ntn_pattern ntns =
24712475
data) ntns
24722476

24732477
let warn_abbreviation_not_bound_to_entry =
2474-
CWarnings.create ~name:"conflicting-abbreviation-entry" ~category:"query"
2478+
CWarnings.create ~name:"conflicting-abbreviation-entry" ~category:CWarnings.CoreCategories.syntax
24752479
(fun () ->
24762480
strbrk "Activation of abbreviations does not expect mentioning a grammar entry.")
24772481

24782482
let warn_abbreviation_not_bound_to_scope =
2479-
CWarnings.create ~name:"conflicting-abbreviation-scope" ~category:"query"
2483+
CWarnings.create ~name:"conflicting-abbreviation-scope" ~category:CWarnings.CoreCategories.syntax
24802484
(fun () ->
24812485
strbrk "Activation of abbreviations does not expect mentioning a scope.")
24822486

kernel/nativeconv.ml

+5-1
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,13 @@ and conv_fix env lvl t1 f1 t2 f2 cu =
142142
else aux (i+1) (conv_val env CONV flvl fi1 fi2 cu) in
143143
aux 0 cu
144144

145+
let w_native_disabled = CWarnings.create_warning
146+
~from:[CWarnings.CoreCategories.native_compiler] ~name:"native-compiler-disabled"
147+
()
148+
145149
let warn_no_native_compiler =
146150
let open Pp in
147-
CWarnings.create ~name:"native-compiler-disabled" ~category:"native-compiler"
151+
CWarnings.create_in w_native_disabled
148152
(fun () -> strbrk "Native compiler is disabled," ++
149153
strbrk " falling back to VM conversion test.")
150154

kernel/nativeconv.mli

+2
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,5 @@ val native_conv : conv_pb -> Genlambda.evars -> types kernel_conversion_function
1717
(** A conversion function parametrized by a universe comparator. Used outside of
1818
the kernel. *)
1919
val native_conv_gen : conv_pb -> Genlambda.evars -> (types, 'a) generic_conversion_function
20+
21+
val w_native_disabled : CWarnings.warning

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 ~category:"debug" ~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

kernel/vconv.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ and conv_arguments env ?from:(from=0) k args1 args2 cu =
181181

182182
let warn_bytecode_compiler_failed =
183183
let open Pp in
184-
CWarnings.create ~name:"bytecode-compiler-failed" ~category:"bytecode-compiler"
184+
CWarnings.create ~name:"bytecode-compiler-failed" ~category:CWarnings.CoreCategories.bytecode_compiler
185185
(fun () -> strbrk "Bytecode compiler failed, " ++
186186
strbrk "falling back to standard conversion")
187187

lib/cDebug.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ let get_flag flag = !flag
5252

5353
let set_flag flag v = flag := v
5454

55-
let warn_unknown_debug = CWarnings.create ~name:"unknown-debug-flag" ~category:"option"
55+
let warn_unknown_debug = CWarnings.create ~name:"unknown-debug-flag"
5656
Pp.(fun name -> str "There is no debug flag \"" ++ str name ++ str "\".")
5757

5858
let get_flags () =

0 commit comments

Comments
 (0)