haxe
haxe copied to clipboard
[typer] Monomorph vs Null<T> inference
This is a regression introduced in 4.3.0 with https://github.com/HaxeFoundation/haxe/commit/02a7f9834b1327507eb9b6f646697960a0ec657f
This can also lead to Fatal error: exception Invalid_argument("List.map2") in genhl with a slightly different example.
Also allows this kind of things https://try.haxe.org/#05A1D90d
4.2.5
Main.hx:12: characters 9-12 : Warning : Unknown<0> : { doWithBar : () -> Unknown<1> }
Main.hx:13: characters 9-22 : Warning : () -> Unknown<0>
Main.hx:16: characters 9-12 : Warning : Unknown<0> : { doWithBar : () -> Unknown<1> }
Main.hx:17: characters 9-22 : Warning : () -> Unknown<0>
Main.hx:6: characters 35-38 : error: (?bar : Null<Bar>) -> Void should be () -> Unknown<0>
Main.hx:6: characters 35-38 : ... have: { doWithBar: (?...) -> ... }
Main.hx:6: characters 35-38 : ... want: { doWithBar: () -> ... }
Main.hx:6: characters 35-38 : ... For function argument 'foo'
Since 4.3.0
Notice how we lose the doWithBar typing:
Main.hx:12: characters 9-12 : Warning : Unknown<0> : { doWithBar : () -> Unknown<1> }
Main.hx:13: characters 9-22 : Warning : () -> Unknown<0>
Main.hx:16: characters 9-12 : Warning : Null<Unknown<0>>
Main.hx:17: characters 9-22 : Warning : Unknown<0>
Main.hx:11: characters 3-16 : Don't know how to cast (Bar):void to ():dyn
With this PR
[WARNING] Main.hx:12: characters 9-12
12 | $type(foo);
| ^^^
| Unknown<0> : { doWithBar : () -> Unknown<1> }
[WARNING] Main.hx:13: characters 9-22
13 | $type(foo.doWithBar);
| ^^^^^^^^^^^^^
| () -> Unknown<0>
[WARNING] Main.hx:16: characters 9-12
16 | $type(foo);
| ^^^
| Null<{ doWithBar : () -> Unknown<0> }>
[WARNING] Main.hx:17: characters 9-22
17 | $type(foo.doWithBar);
| ^^^^^^^^^^^^^
| () -> Unknown<0>
[ERROR] Main.hx:6: characters 35-38
6 | doThings = (foo -> doThingsImpl(foo));
| ^^^
| error: (?bar : Null<Bar>) -> Void should be () -> Unknown<0>
| have: { doWithBar: (?...) -> ... }
| want: { doWithBar: () -> ... }