diff --git a/src/main/scala/scala/async/internal/TransformUtils.scala b/src/main/scala/scala/async/internal/TransformUtils.scala index 9ae48ed2..0c12f95c 100644 --- a/src/main/scala/scala/async/internal/TransformUtils.scala +++ b/src/main/scala/scala/async/internal/TransformUtils.scala @@ -331,7 +331,7 @@ private[async] trait TransformUtils { (cls.info.decls.find(sym => sym.isMethod && sym.asTerm.isParamAccessor) getOrElse NoSymbol) def mkZero(tp: Type): Tree = { - if (tp.typeSymbol.asClass.isDerivedValueClass) { + if (tp.typeSymbol.isClass && tp.typeSymbol.asClass.isDerivedValueClass) { val argZero = mkZero(derivedValueClassUnbox(tp.typeSymbol).infoIn(tp).resultType) val baseType = tp.baseType(tp.typeSymbol) // use base type here to dealias / strip phantom "tagged types" etc. diff --git a/src/test/scala/scala/async/run/gen0/AsyncSpec.scala b/src/test/scala/scala/async/run/gen0/AsyncSpec.scala new file mode 100644 index 00000000..4335f91b --- /dev/null +++ b/src/test/scala/scala/async/run/gen0/AsyncSpec.scala @@ -0,0 +1,46 @@ +package scala.async +package run +package gen0 + +import language.{reflectiveCalls, postfixOps} +import scala.concurrent.{Future, ExecutionContext, future, Await} +import scala.concurrent.duration._ +import scala.async.Async.{async, await} +import org.junit.Test + +class TestS[A](a:A) +{ + + def awrite(v:A): Future[A] = + Future successful v + + def aread: Future[A] = + Future successful a + +} + +class Test1GenAsyncOp[A] { + + import ExecutionContext.Implicits.global + + def testfun[A](a1:A,a2:A): Future[Boolean] = async { + val ts = new TestS(a1) + val s1 = await(ts.awrite(a2)) + val s2 = await(ts.aread) + s1 == s2 + } + +} + + +class AsyncSpec { + + @Test + def `operation with futures generic`() { + val op = new Test1GenAsyncOp[Int] + val f = op.testfun(1,2) + val res = Await.result(f, 2 seconds) + res mustBe (false) + } + +}