diff options
| author | Hugo Herbelin | 2017-06-27 11:31:02 +0200 |
|---|---|---|
| committer | Hugo Herbelin | 2017-06-28 12:31:11 +0200 |
| commit | d01e3b07470ab326f5754332ac812f21794721bc (patch) | |
| tree | 0a6c2db31cd1987f6ef18633974c6c20148b00dd | |
| parent | ebfed8fc20c6cad1eddd5057d191905b42630b4e (diff) | |
A fix for #5598 (no discharge of Existing Classes referring to local variables).
| -rw-r--r-- | pretyping/typeclasses.ml | 3 | ||||
| -rw-r--r-- | test-suite/bugs/closed/5598.v | 8 |
2 files changed, 11 insertions, 0 deletions
diff --git a/pretyping/typeclasses.ml b/pretyping/typeclasses.ml index 24a3811797..0ad940acac 100644 --- a/pretyping/typeclasses.ml +++ b/pretyping/typeclasses.ml @@ -98,6 +98,8 @@ let new_instance cl info glob poly impl = if glob then Some (Lib.sections_depth ()) else None in + if match global with Some n -> n>0 && isVarRef impl | _ -> false then + CErrors.user_err (Pp.str "Cannot set Global an instance referring to a section variable."); { is_class = cl.cl_impl; is_info = info ; is_global = global ; @@ -358,6 +360,7 @@ let discharge_instance (_, (action, inst)) = match inst.is_global with | None -> None | Some n -> + assert (not (isVarRef inst.is_impl)); Some (action, { inst with is_global = Some (pred n); diff --git a/test-suite/bugs/closed/5598.v b/test-suite/bugs/closed/5598.v new file mode 100644 index 0000000000..55fef1a575 --- /dev/null +++ b/test-suite/bugs/closed/5598.v @@ -0,0 +1,8 @@ +(* Checking when discharge of an existing class is possible *) +Section foo. + Context {T} (a : T) (b : T). + Let k := eq_refl a. + Existing Class eq. + Fail Global Existing Instance k. + Existing Instance k. +End foo. |
