Skip to content

Confusion between syntax for pattern alternative and typed pattern on a union type #3332

@abgruszecki

Description

@abgruszecki

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions