aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/core/Phases.scala4
-rw-r--r--src/dotty/tools/dotc/core/TypeComparer.scala3
-rw-r--r--src/dotty/tools/dotc/typer/TypeAssigner.scala7
-rw-r--r--test/dotc/scala-collections.whitelist2
-rw-r--r--tests/pos/i938.scala21
5 files changed, 30 insertions, 7 deletions
diff --git a/src/dotty/tools/dotc/core/Phases.scala b/src/dotty/tools/dotc/core/Phases.scala
index 8d5ec08f7..970a9297a 100644
--- a/src/dotty/tools/dotc/core/Phases.scala
+++ b/src/dotty/tools/dotc/core/Phases.scala
@@ -7,6 +7,7 @@ import dotty.tools.backend.jvm.{LabelDefs, GenBCode}
import util.DotClass
import DenotTransformers._
import Denotations._
+import Decorators._
import config.Printers._
import scala.collection.mutable.{ListBuffer, ArrayBuffer}
import dotty.tools.dotc.transform.TreeTransforms.{TreeTransformer, MiniPhase, TreeTransform}
@@ -121,10 +122,9 @@ object Phases {
phase
}
squashedPhases += phaseToAdd
- val shouldAddYCheck = YCheckAfter.exists(nm => phaseToAdd.phaseName.contains(nm)) || YCheckAll
+ val shouldAddYCheck = YCheckAfter.containsPhase(phaseToAdd) || YCheckAll
if (shouldAddYCheck) {
val checker = new TreeChecker
-
squashedPhases += checker
}
}
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala
index 2045de3ce..6e2346710 100644
--- a/src/dotty/tools/dotc/core/TypeComparer.scala
+++ b/src/dotty/tools/dotc/core/TypeComparer.scala
@@ -488,6 +488,9 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
case _ => tp2 isRef ObjectClass
}
compareJavaArray
+ case tp1: ExprType if ctx.phase.id > ctx.gettersPhase.id =>
+ // getters might have converted T to => T, need to compensate.
+ isSubType(tp1.widenExpr, tp2)
case _ =>
false
}
diff --git a/src/dotty/tools/dotc/typer/TypeAssigner.scala b/src/dotty/tools/dotc/typer/TypeAssigner.scala
index af5fdd428..f7cda1ef6 100644
--- a/src/dotty/tools/dotc/typer/TypeAssigner.scala
+++ b/src/dotty/tools/dotc/typer/TypeAssigner.scala
@@ -46,10 +46,9 @@ trait TypeAssigner {
// TODO: measure the cost of using `existsPart`, and if necessary replace it
// by a `TypeAccumulator` where we have set `stopAtStatic = true`.
tp existsPart {
- case tp: NamedType =>
- forbidden contains tp.symbol
- case _ =>
- false
+ case tp: NamedType => forbidden contains tp.symbol
+ case tp: ThisType => forbidden contains tp.cls
+ case _ => false
}
def apply(tp: Type): Type = tp match {
case tp: TermRef if toAvoid(tp) && variance > 0 =>
diff --git a/test/dotc/scala-collections.whitelist b/test/dotc/scala-collections.whitelist
index c5cd38f4d..1c3931c6a 100644
--- a/test/dotc/scala-collections.whitelist
+++ b/test/dotc/scala-collections.whitelist
@@ -186,7 +186,7 @@
./scala-scala/src/library/scala/collection/SortedSetLike.scala
./scala-scala/src/library/scala/collection/Traversable.scala
-# https://github.com/lampepfl/dotty/issues/938
+# https://github.com/lampepfl/dotty/issues/938 (but relies also on #937 being fixed)
#./scala-scala/src/library/scala/collection/TraversableLike.scala
./scala-scala/src/library/scala/collection/TraversableProxy.scala
diff --git a/tests/pos/i938.scala b/tests/pos/i938.scala
new file mode 100644
index 000000000..cf8fd76e3
--- /dev/null
+++ b/tests/pos/i938.scala
@@ -0,0 +1,21 @@
+object Test {
+ import scala.collection._
+
+ trait T {
+ def f() : Unit
+ }
+
+ def view = new T {
+ def f() = ()
+ }
+
+ trait TLike[+A, RR] { self =>
+
+ def repr: RR = ???
+
+ def view2 = new TraversableView[A, RR] {
+ protected lazy val underlying = self.repr
+ override def foreach[U](f: A => U): Unit = ???
+ }
+ }
+}