@@ -158,6 +158,126 @@ class DottyBytecodeTests extends DottyBytecodeTest {
158158 }
159159 }
160160
161+  @ Test  def  switchOnUnionOfInts  =  {
162+  val  source  = 
163+  """ 
164+  |object Foo { 
165+  | def foo(x: 1 | 2 | 3 | 4 | 5) = x match { 
166+  | case 1 => println(3) 
167+  | case 2 | 3 => println(2) 
168+  | case 4 => println(1) 
169+  | case 5 => println(0) 
170+  | } 
171+  |} 
172+  """  .stripMargin
173+ 
174+  checkBCode(source) { dir => 
175+  val  moduleIn  =  dir.lookupName(" Foo$.class" =  false )
176+  val  moduleNode  =  loadClassNode(moduleIn.input)
177+  val  methodNode  =  getMethod(moduleNode, " foo" 
178+  assert(verifySwitch(methodNode))
179+  }
180+  }
181+ 
182+  @ Test  def  switchOnUnionOfStrings  =  {
183+  val  source  = 
184+  """ 
185+  |object Foo { 
186+  | def foo(s: "one" | "two" | "three" | "four" | "five") = s match { 
187+  | case "one" => println(3) 
188+  | case "two" | "three" => println(2) 
189+  | case "four" | "five" => println(1) 
190+  | case _ => println(0) 
191+  | } 
192+  |} 
193+  """  .stripMargin
194+ 
195+  checkBCode(source) { dir => 
196+  val  moduleIn  =  dir.lookupName(" Foo$.class" =  false )
197+  val  moduleNode  =  loadClassNode(moduleIn.input)
198+  val  methodNode  =  getMethod(moduleNode, " foo" 
199+  assert(verifySwitch(methodNode))
200+  }
201+  }
202+ 
203+  @ Test  def  switchOnUnionOfChars  =  {
204+  val  source  = 
205+  """ 
206+  |object Foo { 
207+  | def foo(ch: 'a' | 'b' | 'c' | 'd' | 'e'): Int = ch match { 
208+  | case 'a' => 1 
209+  | case 'b' => 2 
210+  | case 'c' => 3 
211+  | case 'd' => 4 
212+  | case 'e' => 5 
213+  | } 
214+  |} 
215+  """  .stripMargin
216+ 
217+  checkBCode(source) { dir => 
218+  val  moduleIn  =  dir.lookupName(" Foo$.class" =  false )
219+  val  moduleNode  =  loadClassNode(moduleIn.input)
220+  val  methodNode  =  getMethod(moduleNode, " foo" 
221+  assert(verifySwitch(methodNode))
222+  }
223+  }
224+ 
225+  @ Test  def  switchOnUnionOfIntSingletons  =  {
226+  val  source  = 
227+  """ 
228+  |object Foo { 
229+  | final val One = 1 
230+  | final val Two = 2 
231+  | final val Three = 3 
232+  | final val Four = 4 
233+  | final val Five = 5 
234+  | type Values = One.type | Two.type | Three.type | Four.type | Five.type 
235+  | 
236+  | def foo(s: Values) = s match { 
237+  | case One => println(3) 
238+  | case Two | Three => println(2) 
239+  | case Four => println(1) 
240+  | case Five => println(0) 
241+  | } 
242+  |} 
243+  """  .stripMargin
244+ 
245+  checkBCode(source) { dir => 
246+  val  moduleIn  =  dir.lookupName(" Foo$.class" =  false )
247+  val  moduleNode  =  loadClassNode(moduleIn.input)
248+  val  methodNode  =  getMethod(moduleNode, " foo" 
249+  assert(verifySwitch(methodNode))
250+  }
251+  }
252+ 
253+  @ Test  def  switchOnUnionOfStringSingletons  =  {
254+  val  source  = 
255+  """ 
256+  |object Foo { 
257+  | final val One = "one" 
258+  | final val Two = "two" 
259+  | final val Three = "three" 
260+  | final val Four = "four" 
261+  | final val Five = "five" 
262+  | type Values = One.type | Two.type | Three.type | Four.type | Five.type 
263+  | 
264+  | def foo(s: Values) = s match { 
265+  | case One => println(3) 
266+  | case Two | Three => println(2) 
267+  | case Four => println(1) 
268+  | case Five => println(0) 
269+  | } 
270+  |} 
271+  """  .stripMargin
272+ 
273+  checkBCode(source) { dir => 
274+  val  moduleIn  =  dir.lookupName(" Foo$.class" =  false )
275+  val  moduleNode  =  loadClassNode(moduleIn.input)
276+  val  methodNode  =  getMethod(moduleNode, " foo" 
277+  assert(verifySwitch(methodNode))
278+  }
279+  }
280+ 
161281 @ Test  def  matchWithDefaultNoThrowMatchError  =  {
162282 val  source  = 
163283 """ class Test {
0 commit comments