You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Original bug ID: 6786 Reporter: ceastlund Assigned to:@lpw25 Status: resolved (set by @gasche on 2016-08-30T08:30:02Z) Resolution: fixed Priority: normal Severity: minor Target version: 4.03.1+dev Fixed in version: 4.04.0 +dev / +beta1 / +beta2 Category: typing Has duplicate:#6788 Monitored by:@lpw25@yallop
Bug description
A specific pattern of using 'include' does not type check. It seems like the type checker can do better just by updating some module paths more aggressively.
The behavior I see is that Make_ok1 and Make_ok2 compile fine, but the very similar functor Make_bad does not. The code is in the box below; here is the compile error:
========================================
Error: Signature mismatch:
Modules do not match:
sig
module C : sig module T : sig end type t = Make(T).t end
module T = C.T
type t = Make(T).t
end
is not included in
sig type t module C : sig type t = t end end
In module C:
Modules do not match:
sig module T : sig end type t = Make(T).t end
is not included in
sig type t = C.t end
In module C:
Type declarations do not match:
type t = Make(T).t
is not included in
type t = t
Steps to reproduce
module type S = sig type t end
module Make (M : sig end) : S = struct type t end
module Make_ok1 (M : sig end) : sig
type t
module A : S with type t = t
end = struct
module A = struct
include Make (struct end)
end
include A
end
module Make_ok2 (M : sig end) : sig
type t
module B : S with type t = t
end = struct
module T = struct end
module B = struct
include Make (T)
end
include B
end
module Make_bad (M : sig end) : sig
type t
module C : S with type t = t
end = struct
module C = struct
module T = struct end
include Make (T)
end
include C
end
The text was updated successfully, but these errors were encountered:
The example code above type-checks in my 4.04 branch with the following inferred signature:
module type S = sig type t end
module Make : functor (M : sig end) -> S
module Make_ok1 :
functor (M : sig end) -> sig type t module A : sig type t = t end end
module Make_ok2 :
functor (M : sig end) -> sig type t module B : sig type t = t end end
module Make_bad :
functor (M : sig end) -> sig type t module C : sig type t = t end end
Can this issue be closed or does the problem still occur in more complex scenarios?
Original bug ID: 6786
Reporter: ceastlund
Assigned to: @lpw25
Status: resolved (set by @gasche on 2016-08-30T08:30:02Z)
Resolution: fixed
Priority: normal
Severity: minor
Target version: 4.03.1+dev
Fixed in version: 4.04.0 +dev / +beta1 / +beta2
Category: typing
Has duplicate: #6788
Monitored by: @lpw25 @yallop
Bug description
A specific pattern of using 'include' does not type check. It seems like the type checker can do better just by updating some module paths more aggressively.
The behavior I see is that Make_ok1 and Make_ok2 compile fine, but the very similar functor Make_bad does not. The code is in the box below; here is the compile error:
========================================
Steps to reproduce
module type S = sig type t end
module Make (M : sig end) : S = struct type t end
module Make_ok1 (M : sig end) : sig
type t
module A : S with type t = t
end = struct
module A = struct
include Make (struct end)
end
include A
end
module Make_ok2 (M : sig end) : sig
type t
module B : S with type t = t
end = struct
module T = struct end
module B = struct
include Make (T)
end
include B
end
module Make_bad (M : sig end) : sig
type t
module C : S with type t = t
end = struct
module C = struct
module T = struct end
include Make (T)
end
include C
end
The text was updated successfully, but these errors were encountered: