diff --git a/library/src/scala/util/control/NonLocalReturns.scala b/library/src/scala/util/control/NonLocalReturns.scala index 857a96bafc3f..c32e0ff16457 100644 --- a/library/src/scala/util/control/NonLocalReturns.scala +++ b/library/src/scala/util/control/NonLocalReturns.scala @@ -19,7 +19,7 @@ object NonLocalReturns { } /** Performs a nonlocal return by throwing an exception. */ - def throwReturn[T](result: T)(using returner: ReturnThrowable[T]): Nothing = + def throwReturn[T](result: T)(using returner: ReturnThrowable[? >: T]): Nothing = returner.throwReturn(result) /** Enable nonlocal returns in `op`. */ diff --git a/tests/run/nonlocal-return.scala b/tests/run/nonlocal-return.scala index 4a55dc266edf..7527401faa2e 100644 --- a/tests/run/nonlocal-return.scala +++ b/tests/run/nonlocal-return.scala @@ -8,9 +8,20 @@ object Test { false } + trait Animal + object Dog extends Animal + object Cat extends Animal + + def animal(arg: Int): Animal = returning { + if (arg < 0) throwReturn(Dog) + Cat + } + def main(arg: Array[String]): Unit = { assert(has(1 :: 2 :: Nil, 1)) assert(has(1 :: 2 :: Nil, 2)) assert(!has(1 :: 2 :: Nil, 3)) + assert(animal(1) == Cat) + assert(animal(-1) == Dog) } -} +} \ No newline at end of file