summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Infer.scala2
-rw-r--r--src/library/scala/concurrent/impl/Promise.scala10
2 files changed, 9 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
index 310198ec0c..7b72169ba9 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
@@ -1068,7 +1068,7 @@ trait Infer {
try {
// debuglog("TVARS "+ (tvars map (_.constr)))
// look at the argument types of the primary constructor corresponding to the pattern
- val variances = undetparams map varianceInType(ctorTp)
+ val variances = undetparams map varianceInType(ctorTp.paramTypes.headOption getOrElse ctorTp)
val targs = solvedTypes(tvars, undetparams, variances, true, lubDepth(List(resTp, pt)))
// checkBounds(tree, NoPrefix, NoSymbol, undetparams, targs, "inferred ")
// no checkBounds here. If we enable it, test bug602 fails.
diff --git a/src/library/scala/concurrent/impl/Promise.scala b/src/library/scala/concurrent/impl/Promise.scala
index 585f71f3cf..0087b71ea8 100644
--- a/src/library/scala/concurrent/impl/Promise.scala
+++ b/src/library/scala/concurrent/impl/Promise.scala
@@ -80,8 +80,10 @@ object Promise {
def EmptyPending[T](): FState[T] = emptyPendingValue.asInstanceOf[FState[T]]
/** Represents the internal state.
+ *
+ * [adriaan] it's unsound to make FState covariant (tryComplete won't type check)
*/
- sealed trait FState[+T] { def value: Option[Try[T]] }
+ sealed trait FState[T] { def value: Option[Try[T]] }
case class Pending[T](listeners: List[Try[T] => Any] = Nil) extends FState[T] {
def value: Option[Try[T]] = None
@@ -155,7 +157,11 @@ object Promise {
def tryComplete(v: Try[T]): List[Try[T] => Any] = {
getState match {
case cur @ Pending(listeners) =>
- if (updateState(cur, if (v.isFailure) Failure(Some(v.asInstanceOf[util.Failure[T]])) else Success(Some(v.asInstanceOf[util.Success[T]])))) listeners
+ val newState =
+ if (v.isFailure) Failure(Some(v.asInstanceOf[util.Failure[T]]))
+ else Success(Some(v.asInstanceOf[util.Success[T]]))
+
+ if (updateState(cur, newState)) listeners
else tryComplete(v)
case _ => null
}