aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-07-06 13:46:27 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-07-06 13:46:27 +1000
commit93dab7a6fe81227953d087813d5cab0d0634b9f2 (patch)
tree4e691e26acf1874b8027aace98e75be4d941e6b7
parent9ada5dcbf0c2dcd233069bc903f854580df968c3 (diff)
parent953414f53691ee4e0d9a34d304a0ebef60ce68f6 (diff)
downloadscala-async-93dab7a6fe81227953d087813d5cab0d0634b9f2.tar.gz
scala-async-93dab7a6fe81227953d087813d5cab0d0634b9f2.tar.bz2
scala-async-93dab7a6fe81227953d087813d5cab0d0634b9f2.zip
Merge pull request #108 from retronym/ticket/106-2.10.x
Fix compiler crash with value class in result position
-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 {