Skip to content

Commit e9105c9

Browse files
committed
Merge pull request #1039 from dotty-staging/fix-#998
Fix #998
2 parents 8ceaba7 + eb1197c commit e9105c9

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

src/dotty/tools/dotc/core/TypeOps.scala

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,28 @@ trait TypeOps { this: Context => // TODO: Make standalone object.
269269
if (ctx.featureEnabled(defn.LanguageModuleClass, nme.keepUnions)) tp
270270
else tp match {
271271
case tp: OrType =>
272-
val commonBaseClasses = tp.mapReduceOr(_.baseClasses)(intersect)
273-
val doms = dominators(commonBaseClasses, Nil)
274-
doms.map(tp.baseTypeWithArgs).reduceLeft(AndType.apply)
272+
def isClassRef(tp: Type): Boolean = tp match {
273+
case tp: TypeRef => tp.symbol.isClass
274+
case tp: RefinedType => isClassRef(tp.parent)
275+
case _ => false
276+
}
277+
def next(tp: TypeProxy) = tp.underlying match {
278+
case TypeBounds(_, hi) => hi
279+
case nx => nx
280+
}
281+
tp.tp1 match {
282+
case tp1: TypeProxy if !isClassRef(tp1) =>
283+
approximateUnion(next(tp1) | tp.tp2)
284+
case _ =>
285+
tp.tp2 match {
286+
case tp2: TypeProxy if !isClassRef(tp2) =>
287+
approximateUnion(tp.tp1 | next(tp2))
288+
case _ =>
289+
val commonBaseClasses = tp.mapReduceOr(_.baseClasses)(intersect)
290+
val doms = dominators(commonBaseClasses, Nil)
291+
doms.map(tp.baseTypeWithArgs).reduceLeft(AndType.apply)
292+
}
293+
}
275294
case tp @ AndType(tp1, tp2) =>
276295
tp derived_& (approximateUnion(tp1), approximateUnion(tp2))
277296
case tp: RefinedType =>

tests/pos/i998.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
object Test {
2+
def foo[A <: X, B <: X, X](left: A, right: B): Unit = {
3+
val elem = if (false) left else right
4+
val check: X = elem
5+
}
6+
}

0 commit comments

Comments
 (0)