-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Labels
Description
As in the title, running this code in REPL throws java.lang.VerifyError
:
scala> def f(): String | Int = 0
def f(): String | Int
scala> f() match { case s: String | Int => s }
java.lang.VerifyError: Bad local variable type
Exception Details:
Location:
rs$line$2$.<init>()V @33: aload_3
Reason:
Type top (current frame, locals[3]) is not assignable to reference type
Current Frame:
bci: @33
flags: { }
locals: { 'rs$line$2$', 'java/lang/Object' }
stack: { 'rs$line$2$' }
Bytecode:
0x0000000: 2ab7 0014 2ab3 0016 2ab2 001b b600 1f4c
0x0000010: 2bc1 0021 9900 172b c000 214d 2c4e a700
0x0000020: 072d a700 06a7 fffc a700 1cb2 0026 2bb6
0x0000030: 002a 9900 09a7 ffec 0000 bfbb 002c 592b
0x0000040: b700 2fbf b500 31b1
Stackmap Table:
full_frame(@33,{Object[#2],Object[#4]},{Object[#2]})
full_frame(@37,{Object[#2],Object[#4],Object[#33],Object[#33]},{Object[#2]})
full_frame(@40,{Object[#2],Object[#4]},{Object[#2],Top})
same_locals_1_stack_item_frame(@43,Object[#2])
full_frame(@56,{},{Object[#53]})
full_frame(@59,{Object[#2],Object[#4]},{Object[#2]})
full_frame(@68,{Object[#2],Object[#4]},{Object[#2],Top})
at rs$line$2.res0Show(rs$line$2)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at dotty.tools.repl.Rendering.valueOf(Rendering.scala:58)
at dotty.tools.repl.Rendering.renderVal(Rendering.scala:79)
at dotty.tools.repl.ReplDriver.$anonfun$displayDefinitions$8(ReplDriver.scala:269)
at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)
at scala.collection.mutable.ResizableArray.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ResizableArray.foreach$(ResizableArray.scala:52)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
at scala.collection.TraversableLike.map(TraversableLike.scala:234)
at scala.collection.TraversableLike.map$(TraversableLike.scala:227)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at dotty.tools.repl.ReplDriver.displayMembers$1(ReplDriver.scala:269)
at dotty.tools.repl.ReplDriver.$anonfun$displayDefinitions$15(ReplDriver.scala:296)
at scala.Option.map(Option.scala:146)
at dotty.tools.repl.ReplDriver.$anonfun$displayDefinitions$13(ReplDriver.scala:294)
at dotty.tools.dotc.core.Periods.atPhase(Periods.scala:26)
at dotty.tools.dotc.core.Phases.atPhase(Phases.scala:36)
at dotty.tools.dotc.core.Phases.atPhase$(Phases.scala:35)
at dotty.tools.dotc.core.Contexts$Context.atPhase(Contexts.scala:57)
at dotty.tools.repl.ReplDriver.displayDefinitions(ReplDriver.scala:289)
at dotty.tools.repl.ReplDriver.$anonfun$compile$2(ReplDriver.scala:226)
at scala.util.Either.fold(Either.scala:188)
at dotty.tools.repl.ReplDriver.compile(ReplDriver.scala:220)
at dotty.tools.repl.ReplDriver.interpret(ReplDriver.scala:190)
at dotty.tools.repl.ReplDriver.runUntilQuit(ReplDriver.scala:143)
at dotty.tools.repl.Main$.main(Main.scala:6)
at dotty.tools.repl.Main.main(Main.scala)
Parenthesising the type, however, runs normally:
scala> f() match { case s: (String | Int) => s }
val res2: Any = 0