aboutsummaryrefslogtreecommitdiff
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:51:12 +1000
commit953414f53691ee4e0d9a34d304a0ebef60ce68f6 (patch)
treed2ca0ffb68a7a502a40c31e427157e451d29a90a
parent9da0183d3932a432da312cce29184aaac788facb (diff)
downloadscala-async-953414f53691ee4e0d9a34d304a0ebef60ce68f6.tar.gz
scala-async-953414f53691ee4e0d9a34d304a0ebef60ce68f6.tar.bz2
scala-async-953414f53691ee4e0d9a34d304a0ebef60ce68f6.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`. (cherry picked from commit f4275e22e000541eb619808723b70bd64b9b4873)
-rw-r--r--src/main/scala/scala/async/internal/TransformUtils.scala5
-rw-r--r--src/test/scala/scala/async/run/toughtype/ToughType.scala13
2 files changed, 16 insertions, 2 deletions
diff --git a/src/main/scala/scala/async/internal/TransformUtils.scala b/src/main/scala/scala/async/internal/TransformUtils.scala
index 0b8cd00..da76c18 100644
--- a/src/main/scala/scala/async/internal/TransformUtils.scala
+++ b/src/main/scala/scala/async/internal/TransformUtils.scala
@@ -259,10 +259,11 @@ private[async] trait TransformUtils {
if (tp.typeSymbol.isDerivedValueClass) {
val argZero = mkZero(tp.memberType(tp.typeSymbol.derivedValueClassUnbox).resultType)
val target: Tree = gen.mkAttributedSelect(
- typer.typedPos(macroPos)(
+ callSiteTyper.typedPos(macroPos)(
New(TypeTree(tp.baseType(tp.typeSymbol)))), tp.typeSymbol.primaryConstructor)
val zero = gen.mkMethodCall(target, argZero :: Nil)
- gen.mkCast(zero, tp)
+ // restore the original type which we might otherwise have weakened with `baseType` above
+ callSiteTyper.typedPos(macroPos)(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 0f56ae0..ec59399 100644
--- a/src/test/scala/scala/async/run/toughtype/ToughType.scala
+++ b/src/test/scala/scala/async/run/toughtype/ToughType.scala
@@ -286,6 +286,19 @@ class ToughTypeSpec {
val result = Await.result(fut, 5.seconds)
result mustBe None
}
+
+ // 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 {