Skip to content

Commit 417b7dd

Browse files
committed
Fix #7711: Allow RefinedTpts to be shared
Previously, each reference to a shared refined type created its own RefinementClass.
1 parent 77ca516 commit 417b7dd

File tree

5 files changed

+29
-1
lines changed

5 files changed

+29
-1
lines changed

compiler/src/dotty/tools/dotc/core/tasty/TreePickler.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,7 @@ class TreePickler(pickler: TastyPickler) {
552552
if (refinements.isEmpty) pickleTree(parent)
553553
else {
554554
val refineCls = refinements.head.symbol.owner.asClass
555+
registerDef(refineCls)
555556
pickledTypes.put(refineCls.typeRef, currentAddr)
556557
writeByte(REFINEDtpt)
557558
refinements.foreach(preRegister)

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1167,7 +1167,9 @@ class TreeUnpickler(reader: TastyReader,
11671167
val argPats = until(end)(readTerm())
11681168
UnApply(fn, implicitArgs, argPats, patType)
11691169
case REFINEDtpt =>
1170-
val refineCls = ctx.newRefinedClassSymbol(coordAt(start))
1170+
val refineCls = symAtAddr.getOrElse(start,
1171+
ctx.newRefinedClassSymbol(coordAt(start))).asClass
1172+
registerSym(start, refineCls)
11711173
typeAtAddr(start) = refineCls.typeRef
11721174
val parent = readTpt()
11731175
val refinements = readStats(refineCls, end)(localContext(refineCls))

tests/pos/i7711/crash1_1.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package scalaLibV
2+
3+
import reflect.Selectable.reflectiveSelectable
4+
5+
// Church-encoded Booleans, in DOT.
6+
type IFT = (x : { type IFTA }) => x.IFTA => x.IFTA => x.IFTA
7+
8+
val iftTrue : IFT =
9+
x => t => f => t

tests/pos/i7711/crash2_1.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package listV
2+
3+
//import reflect.Selectable.reflectiveSelectable
4+
import scalaLibV._
5+
6+
object sci {
7+
val isEmpty = iftTrue
8+
}

tests/pos/i7711/crash2_2.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package listV
2+
3+
//import reflect.Selectable.reflectiveSelectable
4+
import scalaLibV._
5+
6+
object sci {
7+
val isEmpty = iftTrue // 1nd try
8+
}

0 commit comments

Comments
 (0)