File tree 3 files changed +15
-1
lines changed
compiler/src/dotty/tools/dotc/core 3 files changed +15
-1
lines changed Original file line number Diff line number Diff line change @@ -369,7 +369,7 @@ object TypeOps:
369
369
}
370
370
371
371
// Step 3: Intersect base classes of both sides
372
- val commonBaseClasses = tp.mapReduceOr (_.baseClasses)(intersect)
372
+ val commonBaseClasses = tp.mapReduceAndOr (_.baseClasses)(intersect)
373
373
val doms = dominators(commonBaseClasses, Nil )
374
374
def baseTp (cls : ClassSymbol ): Type =
375
375
tp.baseType(cls).mapReduceOr(identity)(mergeRefinedOrApplied)
Original file line number Diff line number Diff line change @@ -478,6 +478,11 @@ object Types {
478
478
case _ => f(this )
479
479
}
480
480
481
+ final def mapReduceAndOr [T ](f : Type => T )(g : (T , T ) => T )(using Context ): T = stripTypeVar match {
482
+ case tp : AndOrType => g(tp.tp1.mapReduceAndOr(f)(g), tp.tp2.mapReduceAndOr(f)(g))
483
+ case _ => f(this )
484
+ }
485
+
481
486
// ----- Associated symbols ----------------------------------------------
482
487
483
488
/** The type symbol associated with the type */
Original file line number Diff line number Diff line change
1
+ trait A
2
+
3
+ def consume [T ](t : T ): Unit = ()
4
+
5
+ def fails (p : (Double & A ) | Null ): Unit = consume(p) // was: assertion failed: <notype> & A
6
+
7
+ def switchedOrder (p : (A & Double ) | Null ): Unit = consume(p) // ok
8
+ def nonPrimitive (p : (String & A ) | Null ): Unit = consume(p) // ok
9
+ def notNull (p : (Double & A )): Unit = consume(p) // ok
You can’t perform that action at this time.
0 commit comments