diff options
-rw-r--r-- | src/main/scala/scala/async/ExprBuilder.scala | 3 | ||||
-rw-r--r-- | src/test/scala/scala/async/neg/LocalClasses0Spec.scala | 17 |
2 files changed, 19 insertions, 1 deletions
diff --git a/src/main/scala/scala/async/ExprBuilder.scala b/src/main/scala/scala/async/ExprBuilder.scala index 3a27d1d..3d6ac90 100644 --- a/src/main/scala/scala/async/ExprBuilder.scala +++ b/src/main/scala/scala/async/ExprBuilder.scala @@ -530,7 +530,8 @@ class ExprBuilder[C <: Context with Singleton](val c: C) extends AsyncUtils { stateBuilder = new builder.AsyncStateBuilder(currState, toRename) case ClassDef(_, name, _, _) => - c.error(stat.pos, s"Local class $name illegal within `async` block") + // do not allow local class definitions, because of SI-5467 (specific to case classes, though) + c.error(stat.pos, s"Local class ${name.decoded} illegal within `async` block") case _ => checkForUnsupportedAwait(stat) diff --git a/src/test/scala/scala/async/neg/LocalClasses0Spec.scala b/src/test/scala/scala/async/neg/LocalClasses0Spec.scala index 6c7b579..6d4c4da 100644 --- a/src/test/scala/scala/async/neg/LocalClasses0Spec.scala +++ b/src/test/scala/scala/async/neg/LocalClasses0Spec.scala @@ -59,6 +59,23 @@ class LocalClasses0Spec { } @Test + def `reject a local class with symbols in its name`() { + expectError("Local class :: illegal within `async` block", "-cp target/scala-2.10/classes -deprecation -Xfatal-warnings") { + """ + | import scala.concurrent.{Future, ExecutionContext} + | import ExecutionContext.Implicits.global + | import scala.async.Async._ + | async { + | val fut = Future { 5 } + | val x = await(fut) + | case class ::(name: String) + | x + | } + """.stripMargin + } + } + + @Test def `reject a nested local class`() { expectError("Local class Person illegal within `async` block", "-cp target/scala-2.10/classes -deprecation -Xfatal-warnings") { """ |