diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-07-09 10:50:52 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-07-09 10:50:52 +1000 |
commit | e4053220e091988e883f87d66459f329d5a39920 (patch) | |
tree | a8c95fdf158b9f4ca7cf766e8569d28ef33d9b4d /src | |
parent | 2d8506a64392cd7192b6831c38798cc9a7c8bfed (diff) | |
download | scala-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.scala | 6 | ||||
-rw-r--r-- | src/test/scala/scala/async/run/match0/Match0.scala | 21 |
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" + } } |