sig
  type t =
      Java_1_0
    | Java_1_1
    | Java_1_2
    | Java_1_3
    | Java_1_4
    | Java_1_5
    | Java_1_6
    | Java_1_7
    | Java_1_8
  val all : Version.t list
  val default : Version.t
  val to_string : Version.t -> string
  type bound = { bound_version : Version.t; bound_feature : string; }
  type bounds = Version.bound * Version.bound option
  val make_bounds : string -> Version.t -> Version.t option -> Version.bounds
  val empty_bounds : Version.bounds -> bool
  type error =
      Invalid_version
    | Unsupported_feature of (Utils.u2 * Utils.u2) * string
    | Deprecated_feature of (Utils.u2 * Utils.u2) * string
  exception Exception of Version.error
  val string_of_error : Version.error -> string
  val min_supported : Utils.u2 * Utils.u2
  val max_supported : Utils.u2 * Utils.u2
  val major_minor_of_version : Version.t -> Utils.u2 * Utils.u2
  val version_of_major_minor : Utils.u2 * Utils.u2 -> Version.t
  val at_least : string -> Version.t -> Version.t -> unit
  val at_most : string -> Version.t -> Version.t -> unit
  val check : Version.bounds -> Version.t -> unit
  val intersect : Version.bounds -> Version.bounds -> Version.bounds
  val intersect_list : Version.bounds list -> Version.bounds
  val equal : Version.t -> Version.t -> bool
  val compare : Version.t -> Version.t -> int
  val hash : Version.t -> int
end