Skip to content

isSubtype: try to dealias TypeRefs before recursively checking the prefixes #976

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Nov 25, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions src/dotty/tools/dotc/core/TypeComparer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -144,15 +144,15 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
case info2: TypeAlias => isSubType(tp1, info2.alias)
case _ => info1 match {
case info1: TypeAlias => isSubType(info1.alias, tp2)
case NoType => secondTry(tp1, tp2)
case _ => thirdTryNamed(tp1, tp2)
case _ => false
}
}
def compareNamed = {
implicit val ctx: Context = this.ctx // Dotty deviation: implicits need explicit type
tp1 match {
case tp1: NamedType =>
val sym1 = tp1.symbol
compareAlias(tp1.info) ||
(if ((sym1 ne NoSymbol) && (sym1 eq tp2.symbol))
ctx.erasedTypes || sym1.isStaticOwner || isSubType(tp1.prefix, tp2.prefix)
else
Expand All @@ -164,10 +164,11 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
) ||
compareHK(tp1, tp2, inOrder = true) ||
compareHK(tp2, tp1, inOrder = false) ||
compareAlias(tp1.info)
thirdTryNamed(tp1, tp2)
case _ =>
compareHK(tp2, tp1, inOrder = false) ||
compareAlias(NoType)
compareAlias(NoType) ||
secondTry(tp1, tp2)
}
}
compareNamed
Expand Down
36 changes: 18 additions & 18 deletions test/dotc/scala-collections.whitelist
Original file line number Diff line number Diff line change
Expand Up @@ -263,16 +263,13 @@
./scala-scala/src/library/scala/collection/generic/GenericSeqCompanion.scala
./scala-scala/src/library/scala/collection/generic/GenericSetTemplate.scala

# deep subtype
#./scala-scala/src/library/scala/collection/generic/GenericTraversableTemplate.scala
./scala-scala/src/library/scala/collection/generic/GenericTraversableTemplate.scala

./scala-scala/src/library/scala/collection/generic/HasNewBuilder.scala
./scala-scala/src/library/scala/collection/generic/HasNewCombiner.scala

# https://github.com/lampepfl/dotty/issues/943
# [error] Test dotc.tests.compileStdLib failed: java.lang.Error: deep subtype, took 6.462 sec
#./scala-scala/src/library/scala/collection/generic/ImmutableMapFactory.scala
#./scala-scala/src/library/scala/collection/generic/ImmutableSetFactory.scala
./scala-scala/src/library/scala/collection/generic/ImmutableMapFactory.scala
./scala-scala/src/library/scala/collection/generic/ImmutableSetFactory.scala

./scala-scala/src/library/scala/collection/generic/ImmutableSortedMapFactory.scala
./scala-scala/src/library/scala/collection/generic/ImmutableSortedSetFactory.scala
Expand All @@ -282,20 +279,23 @@
./scala-scala/src/library/scala/collection/generic/IsTraversableOnce.scala
./scala-scala/src/library/scala/collection/generic/IterableForwarder.scala

# [error] Test dotc.tests.compileStdLib failed: java.lang.Error: deep subtype
# fails if any of those classes are added:
#./scala-scala/src/library/scala/collection/generic/MapFactory.scala
#./scala-scala/src/library/scala/collection/generic/MutableMapFactory.scala
#./scala-scala/src/library/scala/collection/generic/MutableSetFactory.scala
#./scala-scala/src/library/scala/collection/generic/MutableSortedSetFactory.scala
./scala-scala/src/library/scala/collection/generic/MapFactory.scala
./scala-scala/src/library/scala/collection/generic/MutableMapFactory.scala
./scala-scala/src/library/scala/collection/generic/MutableSetFactory.scala
./scala-scala/src/library/scala/collection/generic/ParMapFactory.scala
./scala-scala/src/library/scala/collection/generic/SeqFactory.scala
./scala-scala/src/library/scala/collection/generic/SortedMapFactory.scala
./scala-scala/src/library/scala/collection/generic/SortedSetFactory.scala
./scala-scala/src/library/scala/collection/generic/SetFactory.scala

# deep subtype
#./scala-scala/src/library/scala/collection/generic/ParFactory.scala
#./scala-scala/src/library/scala/collection/generic/ParMapFactory.scala
#./scala-scala/src/library/scala/collection/generic/ParSetFactory.scala
#./scala-scala/src/library/scala/collection/generic/SeqFactory.scala
#./scala-scala/src/library/scala/collection/generic/SortedMapFactory.scala
#./scala-scala/src/library/scala/collection/generic/SortedSetFactory.scala
#./scala-scala/src/library/scala/collection/generic/SetFactory.scala

# https://github.com/lampepfl/dotty/issues/974
#./scala-scala/src/library/scala/collection/generic/MutableSortedSetFactory.scala

# cyclic reference, maybe related to #974
#./scala-scala/src/library/scala/collection/generic/ParSetFactory.scala

./scala-scala/src/library/scala/collection/generic/OrderedTraversableFactory.scala
./scala-scala/src/library/scala/collection/generic/SeqForwarder.scala
Expand Down
15 changes: 15 additions & 0 deletions tests/pos/hk-deep-subtype.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// Minimized from scala.collection.generic.GenTraversableFactory plus dependencies
import scala.annotation.unchecked.uncheckedVariance

trait GT[A] extends GTT[A, GT]

trait HNB[B]
trait GTT[+C, DD[X] <: GT[X]] extends HNB[DD[C] @uncheckedVariance] // Can be any annotation and still crash

class GTF[EE[X] <: GT[X] with GTT[X, EE]]
{
def foo[F]: EE[F] = ???
def bar[G](f: G): EE[G] = ???

def tabulate: EE[EE[Int]] = bar(foo)
}