aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/src/dotty/tools/dotc/core/TypeErasure.scala12
-rw-r--r--tests/pos/erased-lub-2.scala15
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)
+}