From f9eb27daf750010556d49dd1411ac2433ac29f17 Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Sat, 14 Jun 2014 12:51:24 +0200 Subject: [PATCH] Avoid NotImplementedError awaiting a Future[Nothing] `gen.mkZero(NothingTpe)` gives the tree `Predef.???`. Instead, we should leave the `await` field uninitialized with `ValDef(..., rhs = EmptyTree)`. Fixes #66 --- src/main/scala/scala/async/internal/Lifter.scala | 3 +-- .../scala/async/run/toughtype/ToughType.scala | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/scala/scala/async/internal/Lifter.scala b/src/main/scala/scala/async/internal/Lifter.scala index 7b102d11..403eae91 100644 --- a/src/main/scala/scala/async/internal/Lifter.scala +++ b/src/main/scala/scala/async/internal/Lifter.scala @@ -113,8 +113,7 @@ trait Lifter { sym.setFlag(MUTABLE | STABLE | PRIVATE | LOCAL) sym.name = name.fresh(sym.name.toTermName) sym.modifyInfo(_.deconst) - val zeroRhs = atPos(t.pos)(gen.mkZero(vd.symbol.info)) - treeCopy.ValDef(vd, Modifiers(sym.flags), sym.name, TypeTree(sym.tpe).setPos(t.pos), zeroRhs) + treeCopy.ValDef(vd, Modifiers(sym.flags), sym.name, TypeTree(sym.tpe).setPos(t.pos), EmptyTree) case dd@DefDef(_, _, tparams, vparamss, tpt, rhs) => sym.name = this.name.fresh(sym.name.toTermName) sym.setFlag(PRIVATE | LOCAL) diff --git a/src/test/scala/scala/async/run/toughtype/ToughType.scala b/src/test/scala/scala/async/run/toughtype/ToughType.scala index 458157c3..54a53c86 100644 --- a/src/test/scala/scala/async/run/toughtype/ToughType.scala +++ b/src/test/scala/scala/async/run/toughtype/ToughType.scala @@ -211,6 +211,22 @@ class ToughTypeSpec { }(SomeExecutionContext) } } + + } + + @Test def ticket66Nothing() { + import scala.concurrent.Future + import scala.concurrent.ExecutionContext.Implicits.global + val e = new Exception() + val f: Future[Nothing] = Future.failed(e) + val f1 = async { + await(f) + } + try { + Await.result(f1, 5.seconds) + } catch { + case `e` => + } } }