Mantis Bug Tracker

View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0007519OCamltypingpublic2017-04-20 20:442017-04-20 21:43
Reportermottl 
Assigned To 
PrioritynormalSeverityminorReproducibilityalways
StatusnewResolutionopen 
PlatformOSOS Version
Product Version4.04.1 
Target VersionFixed in Version 
Summary0007519: Incorrect rejection of program due to faux scope escape
DescriptionThe following program is rejected by the compiler:

-----
module Gen_spec = struct type 't extra = unit end

module type S = sig
  module Spec : sig type 't extra = unit end

  type t
  val make : unit -> t Spec.extra
end (* S *)

module Make () : S with module Spec := Gen_spec = struct
  type t = int
  let make () = ()
end (* Make *)

let () =
  let module M = Make () in
  M.make ()
  (* (M.make () : unit) *)
-----

The error is:

-----
File "./foo.ml", line 17, characters 2-11:
Error: This expression has type M.t Gen_spec.extra = unit
       but an expression was expected of type unit
       The type constructor M.t would escape its scope
-----

The error shows that the compiler already knows that M.t Gen_spec.extra is equivalent to the unit type. Therefore, there should not be any type escaping the scope of the local module. Using the commented out last line instead of the preceding one also shows that the compiler will happily unify the type with "unit" and then accept the program.

I suppose that there is a missing conversion somewhere in the type checker that should attempt to eliminate all local types before complaining about scope violations.
TagsNo tags attached.
Attached Files

- Relationships

-  Notes
There are no notes attached to this issue.

- Issue History
Date Modified Username Field Change
2017-04-20 20:44 mottl New Issue


Copyright © 2000 - 2011 MantisBT Group
Powered by Mantis Bugtracker