-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Closed
Description
Original bug ID: 6744
Reporter: @lpw25
Assigned to: @garrigue
Status: assigned (set by @garrigue on 2015-01-16T15:37:54Z)
Resolution: open
Priority: normal
Severity: minor
Target version: later
Category: typing
Related to: #7741
Bug description
When a unifying closed polymorphic variant types (e.g. [< `Foo of int]) there is no equivalent of the occur_univars check. This can allow univars to escape, for example:
# let (n : < m : 'a. [< `Foo of int] -> 'a >) =
object method m : 'x. [< `Foo of 'x] -> 'x = fun x -> assert false end;;
Characters -1--1:
let (n : < m : 'a. [< `Foo of int] -> 'a >) =
Error: Values do not match:
val n : < m : 'a. [< `Foo of int & 'a0 ] -> 'a >
is not included in
val n : < m : 'a. [< `Foo of int & 'a0 ] -> 'a >
In this example, the escaped univar doesn't get very far because it triggers an module inclusion error of the n value with itself, and I have not been able to produce an example of genuine unsoundness because of this bug. However, it is clearly not correct to allow the variable to escape like this, and could potentially be unsound.