aboutsummaryrefslogtreecommitdiff
path: root/engine/univops.ml
diff options
context:
space:
mode:
authorGaëtan Gilbert2017-12-05 20:22:14 +0100
committerGaëtan Gilbert2017-12-06 13:23:31 +0100
commit5b8b02cd060097c3c980b0498257c30eda1ad207 (patch)
treeff0e51230d3518bb2db523187644cd73d40aecf5 /engine/univops.ml
parent2c5e81e3bc6ec17d253aeedd1b2bf4ccd3b81933 (diff)
Fix #6323: stronger restrict universe context vs abstract.
In the test we do [let X : Type@{i} := Set in ...] with Set abstracted. The constraint [Set < i] was lost in the abstract. Universes of a monomorphic reference [c] are considered to appear in the term [c].
Diffstat (limited to 'engine/univops.ml')
-rw-r--r--engine/univops.ml21
1 files changed, 17 insertions, 4 deletions
diff --git a/engine/univops.ml b/engine/univops.ml
index 9a9ae12cab..df25d87252 100644
--- a/engine/univops.ml
+++ b/engine/univops.ml
@@ -9,12 +9,25 @@
open Univ
open Constr
-let universes_of_constr c =
+let universes_of_constr env c =
+ let open Declarations in
let rec aux s c =
match kind c with
- | Const (_, u) | Ind (_, u) | Construct (_, u) ->
- LSet.fold LSet.add (Instance.levels u) s
- | Sort u when not (Sorts.is_small u) ->
+ | Const (c, u) ->
+ begin match (Environ.lookup_constant c env).const_universes with
+ | Polymorphic_const _ ->
+ LSet.fold LSet.add (Instance.levels u) s
+ | Monomorphic_const (univs, _) ->
+ LSet.union s univs
+ end
+ | Ind ((mind,_), u) | Construct (((mind,_),_), u) ->
+ begin match (Environ.lookup_mind mind env).mind_universes with
+ | Cumulative_ind _ | Polymorphic_ind _ ->
+ LSet.fold LSet.add (Instance.levels u) s
+ | Monomorphic_ind (univs,_) ->
+ LSet.union s univs
+ end
+ | Sort u when not (Sorts.is_small u) ->
let u = Sorts.univ_of_sort u in
LSet.fold LSet.add (Universe.levels u) s
| _ -> Constr.fold aux s c