Skip to content

Commit 788fac8

Browse files
committed
Transform infos of SkolemTypes in TypeMap
A SkolemType is not a symbol whose info is transformed separately. That's why mapping a SkolemType must involve mapping its info. A test case is the new version of pos_valueclasses/t7818.scala.
1 parent 100bdeb commit 788fac8

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

compiler/src/dotty/tools/dotc/core/Types.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4378,6 +4378,8 @@ object Types {
43784378
tp.derivedAnnotatedType(underlying, annot)
43794379
protected def derivedWildcardType(tp: WildcardType, bounds: Type): Type =
43804380
tp.derivedWildcardType(bounds)
4381+
protected def derivedSkolemType(tp: SkolemType, info: Type): Type =
4382+
tp.derivedSkolemType(info)
43814383
protected def derivedClassInfo(tp: ClassInfo, pre: Type): Type =
43824384
tp.derivedClassInfo(pre)
43834385
protected def derivedJavaArrayType(tp: JavaArrayType, elemtp: Type): Type =
@@ -4475,7 +4477,7 @@ object Types {
44754477
derivedMatchType(tp, this(tp.bound), this(tp.scrutinee), tp.cases.mapConserve(this))
44764478

44774479
case tp: SkolemType =>
4478-
tp
4480+
derivedSkolemType(tp, this(tp.info))
44794481

44804482
case tp @ AnnotatedType(underlying, annot) =>
44814483
val underlying1 = this(underlying)
@@ -4756,6 +4758,13 @@ object Types {
47564758
tp.derivedWildcardType(rangeToBounds(bounds))
47574759
}
47584760

4761+
override protected def derivedSkolemType(tp: SkolemType, info: Type): Type = info match {
4762+
case Range(lo, hi) =>
4763+
range(tp.derivedSkolemType(lo), tp.derivedSkolemType(hi))
4764+
case _ =>
4765+
tp.derivedSkolemType(info)
4766+
}
4767+
47594768
override protected def derivedClassInfo(tp: ClassInfo, pre: Type): Type = {
47604769
assert(!isRange(pre))
47614770
// we don't know what to do here; this case has to be handled in subclasses

tests/pos/pos_valueclasses/t7818.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ class Observable1[+T](val asJava: JObservable[_ <: T]) extends AnyVal {
77
// to the typer parameter of the extension method into which the RHS is
88
// transplanted.
99
def synchronize: Observable1[T] = new Observable1(foo(asJava))
10+
11+
// Was generating a Ycheck error after ExtensionMethods.
12+
// Fixed by having TypeMap go over info of SkolemTypes
13+
private[this] def id(x: JObservable[_ <: T]) = x
14+
def synchronize2: Observable1[T] = new Observable1(foo(id(asJava)))
1015
}
1116

1217
class JObservable[T]

0 commit comments

Comments
 (0)