Skip to content

Commit 56933ec

Browse files
authored
Merge pull request #2890 from dotty-staging/fix-#2140
Fix #2140: Avoid exponential subtype complexity
2 parents 1a4060c + a048e50 commit 56933ec

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

compiler/src/dotty/tools/dotc/core/TypeComparer.scala

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -983,17 +983,13 @@ class TypeComparer(initctx: Context) extends DotClass with ConstraintHandling {
983983

984984
/** A type has been covered previously in subtype checking if it
985985
* is some combination of TypeRefs that point to classes, where the
986-
* combiners are RefinedTypes, RecTypes, AndTypes or AnnotatedTypes.
987-
* One exception: Refinements referring to basetype args are never considered
988-
* to be already covered. This is necessary because such refined types might
989-
* still need to be compared with a compareAliasRefined.
986+
* combiners are RefinedTypes, RecTypes, And/Or-Types or AnnotatedTypes.
990987
*/
991-
private def isCovered(tp: Type): Boolean = tp.dealias.stripTypeVar match {
988+
private def isCovered(tp: Type): Boolean = tp.dealias.stripTypeVar match {
992989
case tp: TypeRef => tp.symbol.isClass && tp.symbol != NothingClass && tp.symbol != NullClass
993-
case tp: ProtoType => false
994990
case tp: RefinedOrRecType => isCovered(tp.parent)
995991
case tp: AnnotatedType => isCovered(tp.underlying)
996-
case AndType(tp1, tp2) => isCovered(tp1) && isCovered(tp2)
992+
case tp: AndOrType => isCovered(tp.tp1) && isCovered(tp.tp2)
997993
case _ => false
998994
}
999995

tests/pending/pos/i2140.scala

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
object Test {
2+
def main(args: Array[String]): Unit = {
3+
val s = 1
4+
val t = 23 match {
5+
case 0 => (s)
6+
case 1 => (s, s)
7+
case 2 => (s, s, s)
8+
case 3 => (s, s, s, s)
9+
case 4 => (s, s, s, s, s)
10+
case 5 => (s, s, s, s, s, s)
11+
case 6 => (s, s, s, s, s, s, s)
12+
case 7 => (s, s, s, s, s, s, s, s)
13+
case 8 => (s, s, s, s, s, s, s, s, s)
14+
case 9 => (s, s, s, s, s, s, s, s, s, s)
15+
case 10 => (s, s, s, s, s, s, s, s, s, s, s)
16+
case 11 => (s, s, s, s, s, s, s, s, s, s, s, s)
17+
case 12 => (s, s, s, s, s, s, s, s, s, s, s, s, s)
18+
case 13 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s)
19+
case 14 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
20+
case 15 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
21+
case 16 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
22+
case 17 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
23+
case 18 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
24+
case 19 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
25+
case 20 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
26+
case 21 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
27+
// case 22 => (s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s, s)
28+
}
29+
}
30+
}

0 commit comments

Comments
 (0)