aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-07-06 12:23:52 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-07-06 12:23:52 +1000
commitf4275e22e000541eb619808723b70bd64b9b4873 (patch)
tree9eb2e5c2a77ad875a082c5076f0b92bd7cae08f2 /src
parent1568a28842e2c538ca735a34274ae5e4ee5eca22 (diff)
downloadscala-async-f4275e22e000541eb619808723b70bd64b9b4873.tar.gz
scala-async-f4275e22e000541eb619808723b70bd64b9b4873.tar.bz2
scala-async-f4275e22e000541eb619808723b70bd64b9b4873.zip
Fix compiler crash with value class in result position
We were leaking untyped trees out of the macro, which crashed in refchecks. This commit proactively typechecks the tree returned by `mkZero`.
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/scala/async/internal/TransformUtils.scala3
-rw-r--r--src/test/scala/scala/async/run/toughtype/ToughType.scala13
2 files changed, 14 insertions, 2 deletions
diff --git a/src/main/scala/scala/async/internal/TransformUtils.scala b/src/main/scala/scala/async/internal/TransformUtils.scala
index bd7093f..df958b8 100644
--- a/src/main/scala/scala/async/internal/TransformUtils.scala
+++ b/src/main/scala/scala/async/internal/TransformUtils.scala
@@ -343,9 +343,8 @@ private[async] trait TransformUtils {
New(TypeTree(baseType)))), tpSym.asClass.primaryConstructor)
val zero = gen.mkMethodCall(target, argZero :: Nil)
-
// restore the original type which we might otherwise have weakened with `baseType` above
- gen.mkCast(zero, tp)
+ c.typecheck(atMacroPos(gen.mkCast(zero, tp)))
} else {
gen.mkZero(tp)
}
diff --git a/src/test/scala/scala/async/run/toughtype/ToughType.scala b/src/test/scala/scala/async/run/toughtype/ToughType.scala
index c4d6c80..33c839e 100644
--- a/src/test/scala/scala/async/run/toughtype/ToughType.scala
+++ b/src/test/scala/scala/async/run/toughtype/ToughType.scala
@@ -319,6 +319,19 @@ class ToughTypeSpec {
val result = Await.result(fut, 5.seconds)
result mustEqual 1
}
+
+ // https://github.com/scala/async/issues/106
+ @Test def valueClassT106(): Unit = {
+ import scala.async.internal.AsyncId._
+ async {
+ "whatever value" match {
+ case _ =>
+ await("whatever return type")
+ new IntWrapper("value class matters")
+ }
+ "whatever return type"
+ }
+ }
}
class IntWrapper(val value: String) extends AnyVal {