summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@epfl.ch>2012-03-02 17:58:08 +0100
committerAdriaan Moors <adriaan.moors@epfl.ch>2012-03-09 09:09:42 +0100
commit0cffdf38d9e2d88e66d8649d317f8815716b2748 (patch)
tree70f4c85a0aadaeed8d15eeb8d28be1157cd72456 /src
parentb9082321219f78a86e80fcea2a71d96ee4beb397 (diff)
downloadscala-0cffdf38d9e2d88e66d8649d317f8815716b2748.tar.gz
scala-0cffdf38d9e2d88e66d8649d317f8815716b2748.tar.bz2
scala-0cffdf38d9e2d88e66d8649d317f8815716b2748.zip
SI-5189 1/2: inferConstrInst uses correct variance
fixed concurrent.impl.Promise by making FState invariant (it would be unsound to make it covariant)
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
}