Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions checker/coqchk_main.ml
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,7 @@ let explain_exn = function
| UndeclaredQualities _ -> str"UndeclaredQualities"
| UndeclaredUniverses _ -> str"UndeclaredUniverse"
| BadVariance _ -> str "BadVariance"
| BadQVariance _ -> str "BadQVariance"
| UndeclaredUsedVariables _ -> str "UndeclaredUsedVariables"
| IllFormedConstant _ -> str "IllFormedConstant"
| IllFormedInductive _ -> str "IllFormedInductive"
Expand Down
4 changes: 3 additions & 1 deletion kernel/inferCumulativity.ml
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ let rec infer_fterm cv_pb infos variances hd stk =
let variances = infer_constant (info_env (fst infos)) variances con in
let variances = infer_stack infos variances stk in
set_infer_mode infer_mode variances
with BadVariance _ | NotInferring as e ->
with BadVariance _ | BadVarianceQ _ | NotInferring as e ->
match def with
| None -> raise e
| Some (hd,stk) -> infer_fterm cv_pb infos variances hd stk
Expand Down Expand Up @@ -409,3 +409,5 @@ let infer_inductive ~env_params ~env_ar_par ~arities ~ctors quals univs =
Array.make (Array.length quals) Invariant, Array.make (Array.length univs) Invariant
| BadVariance (lev, expected, actual) ->
Type_errors.error_bad_variance env_params ~lev ~expected ~actual
| BadVarianceQ (qvar, expected, actual) ->
Type_errors.error_bad_qvariance env_params ~qvar ~expected ~actual
6 changes: 5 additions & 1 deletion kernel/type_errors.ml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ type ('constr, 'types, 'r) ptype_error =
| BadCaseRelevance of 'r * 'constr
| BadInvert
| BadVariance of { lev : Level.t; expected : Variance.t; actual : Variance.t }
| BadQVariance of { qvar : Sorts.QVar.t; expected : Variance.t; actual : Variance.t }
| UndeclaredUsedVariables of { declared_vars : Id.Set.t; inferred_vars : Id.Set.t }
| IllFormedConstant of Constant.t * KerName.t
| IllFormedInductive of MutInd.t * KerName.t
Expand Down Expand Up @@ -184,6 +185,9 @@ let error_bad_invert env =
let error_bad_variance env ~lev ~expected ~actual =
raise (TypeError (env, BadVariance {lev;expected;actual}))

let error_bad_qvariance env ~qvar ~expected ~actual =
raise (TypeError (env, BadQVariance {qvar;expected;actual}))

let error_undeclared_used_variables env ~declared_vars ~inferred_vars =
raise (TypeError (env, UndeclaredUsedVariables {declared_vars; inferred_vars}))

Expand Down Expand Up @@ -221,7 +225,7 @@ let map_ptype_error fr f = function
| UndeclaredQualities _ | UndeclaredUniverses _ | NotAllowedSProp
| UnsatisfiedUnivConstraints _
| UnsatisfiedPConstraints _
| ReferenceVariables _ | BadInvert | BadVariance _ | UndeclaredUsedVariables _ | IllFormedConstant _ | IllFormedInductive _ as e -> e
| ReferenceVariables _ | BadInvert | BadVariance _ | BadQVariance _ | UndeclaredUsedVariables _ | IllFormedConstant _ | IllFormedInductive _ as e -> e
| NotAType j -> NotAType (on_judgment f j)
| BadAssumption j -> BadAssumption (on_judgment f j)
| ElimArity (pi, c, ar) -> ElimArity (pi, f c, ar)
Expand Down
3 changes: 3 additions & 0 deletions kernel/type_errors.mli
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ type ('constr, 'types, 'r) ptype_error =
| BadCaseRelevance of 'r * 'constr
| BadInvert
| BadVariance of { lev : Level.t; expected : Variance.t; actual : Variance.t }
| BadQVariance of { qvar : Sorts.QVar.t; expected : Variance.t; actual : Variance.t }
| UndeclaredUsedVariables of { declared_vars : Id.Set.t; inferred_vars : Id.Set.t }
| IllFormedConstant of Constant.t * KerName.t
| IllFormedInductive of MutInd.t * KerName.t
Expand Down Expand Up @@ -170,6 +171,8 @@ val error_bad_invert : env -> 'a

val error_bad_variance : env -> lev:Level.t -> expected:Variance.t -> actual:Variance.t -> 'a

val error_bad_qvariance : env -> qvar:Sorts.QVar.t -> expected:Variance.t -> actual:Variance.t -> 'a

val error_undeclared_used_variables : env -> declared_vars:Id.Set.t -> inferred_vars:Id.Set.t -> 'a

val error_ill_formed_constant : env -> Constant.t -> KerName.t -> 'a
Expand Down
8 changes: 8 additions & 0 deletions test-suite/success/CumulInd.v
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ Inductive E@{s;} : Prop := .
Fail Check fun x:E@{SProp;} => x:E@{Prop;}.
Check fun x:E@{Prop;} => x:E@{Type;}.

(* quality variance is checked like universe variance: analogues of
not_irrelevant, check_covariant and must_unfold above *)
Fail Inductive not_irrelevant_qual@{*s;u} : Prop := nirrq (_ : Type@{s;u}).
Inductive check_covariant_qual@{+s;u} : Prop := covq (_ : Type@{s;u}).

Definition idT@{s;u} (A:Type@{s;u}) : Type@{s;u} := A.
Inductive must_unfold_qual@{*s;u} (A:Type@{s;u}) : Prop := cmustq (_ : idT A).

Module Type Covariant.
Inductive foo@{+s;+u} : Set := .
End Covariant.
Expand Down
7 changes: 7 additions & 0 deletions vernac/himsg.ml
Original file line number Diff line number Diff line change
Expand Up @@ -970,6 +970,12 @@ let explain_bad_variance env sigma ~lev ~expected ~actual =
(fun () -> UVars.Variance.pr expected)
(fun () -> UVars.Variance.pr actual)

let explain_bad_qvariance env sigma ~qvar ~expected ~actual =
fmt "Incorrect variance for sort quality %t:@ expected %t@ but cannot be less restrictive than %t."
(fun () -> Termops.pr_evd_qvar sigma qvar)
(fun () -> UVars.Variance.pr expected)
(fun () -> UVars.Variance.pr actual)

let explain_undeclared_used_variables env sigma ~declared_vars ~inferred_vars =
let l = Id.Set.elements (Id.Set.diff inferred_vars declared_vars) in
let n = List.length l in
Expand Down Expand Up @@ -1050,6 +1056,7 @@ let explain_type_error env sigma err =
| BadCaseRelevance (rlv, case) -> explain_bad_case_relevance env sigma rlv case
| BadInvert -> explain_bad_invert env
| BadVariance {lev;expected;actual} -> explain_bad_variance env sigma ~lev ~expected ~actual
| BadQVariance {qvar;expected;actual} -> explain_bad_qvariance env sigma ~qvar ~expected ~actual
| UndeclaredUsedVariables {declared_vars;inferred_vars} ->
explain_undeclared_used_variables env sigma ~declared_vars ~inferred_vars
| IllFormedConstant (cst, kn) ->
Expand Down
Loading