aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-07-09 10:50:52 +1000
committerJason Zaugg <jzaugg@gmail.com>2013-07-09 10:50:52 +1000
commite4053220e091988e883f87d66459f329d5a39920 (patch)
treea8c95fdf158b9f4ca7cf766e8569d28ef33d9b4d /src
parent2d8506a64392cd7192b6831c38798cc9a7c8bfed (diff)
downloadscala-async-e4053220e091988e883f87d66459f329d5a39920.tar.gz
scala-async-e4053220e091988e883f87d66459f329d5a39920.tar.bz2
scala-async-e4053220e091988e883f87d66459f329d5a39920.zip
Fix "BoxedUnit cannot be cast to String" error.
When convering If and Match nodes to ANF, set the type to Unit. Otherwise, erasure might end up casting BoxedUnit to a real type.
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/scala/async/internal/AnfTransform.scala6
-rw-r--r--src/test/scala/scala/async/run/match0/Match0.scala21
2 files changed, 24 insertions, 3 deletions
diff --git a/src/main/scala/scala/async/internal/AnfTransform.scala b/src/main/scala/scala/async/internal/AnfTransform.scala
index 80f8161..c6e5bcb 100644
--- a/src/main/scala/scala/async/internal/AnfTransform.scala
+++ b/src/main/scala/scala/async/internal/AnfTransform.scala
@@ -87,7 +87,7 @@ private[async] trait AnfTransform {
case _ => Assign(Ident(varDef.symbol), cast(orig))
}
}.setType(orig.tpe)
- val ifWithAssign = treeCopy.If(tree, cond, branchWithAssign(thenp), branchWithAssign(elsep))
+ val ifWithAssign = treeCopy.If(tree, cond, branchWithAssign(thenp), branchWithAssign(elsep)).setType(definitions.UnitTpe)
stats :+ varDef :+ ifWithAssign :+ gen.mkAttributedStableRef(varDef.symbol)
}
@@ -107,9 +107,9 @@ private[async] trait AnfTransform {
case b@Block(caseStats, caseExpr) => treeCopy.Block(b, caseStats, typedAssign(caseExpr))
case _ => typedAssign(body)
}
- treeCopy.CaseDef(cd, pat, guard, newBody)
+ treeCopy.CaseDef(cd, pat, guard, newBody).setType(definitions.UnitTpe)
}
- val matchWithAssign = treeCopy.Match(tree, scrut, casesWithAssign)
+ val matchWithAssign = treeCopy.Match(tree, scrut, casesWithAssign).setType(definitions.UnitTpe)
require(matchWithAssign.tpe != null, matchWithAssign)
stats :+ varDef :+ matchWithAssign :+ gen.mkAttributedStableRef(varDef.symbol)
}
diff --git a/src/test/scala/scala/async/run/match0/Match0.scala b/src/test/scala/scala/async/run/match0/Match0.scala
index 49a3a69..7c392ab 100644
--- a/src/test/scala/scala/async/run/match0/Match0.scala
+++ b/src/test/scala/scala/async/run/match0/Match0.scala
@@ -125,4 +125,25 @@ class MatchSpec {
}
m4("") mustBe 0
}
+
+ @Test def bugCastBoxedUnitToStringMatch() {
+ import scala.async.internal.AsyncId.{async, await}
+ def foo = async {
+ val p2 = await(5)
+ "foo" match {
+ case p3: String =>
+ p2.toString
+ }
+ }
+ foo mustBe "5"
+ }
+
+ @Test def bugCastBoxedUnitToStringIf() {
+ import scala.async.internal.AsyncId.{async, await}
+ def foo = async {
+ val p2 = await(5)
+ if (true) p2.toString else p2.toString
+ }
+ foo mustBe "5"
+ }
}