diff options
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/TypeErasure.scala | 12 | ||||
-rw-r--r-- | tests/pos/erased-lub-2.scala | 15 |
2 files changed, 23 insertions, 4 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/TypeErasure.scala b/compiler/src/dotty/tools/dotc/core/TypeErasure.scala index ff99008bb..2140405b1 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeErasure.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeErasure.scala @@ -246,10 +246,14 @@ object TypeErasure { val cls2 = tp2.classSymbol def loop(bcs: List[ClassSymbol], bestSoFar: ClassSymbol): ClassSymbol = bcs match { case bc :: bcs1 => - if (cls2.derivesFrom(bc)) - if (!bc.is(Trait) && bc != defn.AnyClass) bc - else loop(bcs1, if (bestSoFar.derivesFrom(bc)) bestSoFar else bc) - else + if (cls2.derivesFrom(bc)) { + val newBest = if (bestSoFar.derivesFrom(bc)) bestSoFar else bc + + if (!bc.is(Trait) && bc != defn.AnyClass) + newBest + else + loop(bcs1, newBest) + } else loop(bcs1, bestSoFar) case nil => bestSoFar diff --git a/tests/pos/erased-lub-2.scala b/tests/pos/erased-lub-2.scala new file mode 100644 index 000000000..f0f9b27cc --- /dev/null +++ b/tests/pos/erased-lub-2.scala @@ -0,0 +1,15 @@ +trait Foo + +trait PF[A, +B] { + def apply(x: A): B +} + +object Test { + def orElse2[A1, B1 >: Foo](that: PF[A1, B1]): PF[A1, B1] = ??? + + def identity[E]: PF[E, E] = ??? + + def foo: PF[Foo, Foo] = ??? + + def bla(foo: Foo) = orElse2(identity).apply(foo) +} |