diff options
-rw-r--r-- | src/dotty/tools/dotc/core/Phases.scala | 4 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/TypeComparer.scala | 3 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/TypeAssigner.scala | 7 | ||||
-rw-r--r-- | test/dotc/scala-collections.whitelist | 2 | ||||
-rw-r--r-- | tests/pos/i938.scala | 21 |
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 = ??? + } + } +} |