Skip to content

Commit cc55175

Browse files
committed
Propagate hard vars when replacing Constraint params
1 parent 5290632 commit cc55175

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,9 @@ class OrderingConstraint(private val boundsMap: ParamBounds,
748748
}
749749
if isRemovable(param.binder) then current = current.remove(param.binder)
750750
current.dropDeps(param)
751+
replacedTypeVar match
752+
case replacedTypeVar: TypeVar if isHard(replacedTypeVar) => current = current.hardenTypeVars(replacement)
753+
case _ =>
751754
current.checkWellFormed()
752755
end replace
753756

tests/pos/i18626.scala

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
trait Random[F1[_]]:
2+
def element[T1](list: Seq[T1]): F1[T1] = ???
3+
4+
trait Monad[F2[_]]:
5+
def map[A1, B1](fa: F2[A1])(f: A1 => B1): F2[B1]
6+
7+
object Monad:
8+
extension [F3[_]: Monad, A3](fa: F3[A3])
9+
def map[B3](f: A3 => B3): F3[B3] = ???
10+
11+
sealed trait Animal
12+
object Cat extends Animal
13+
object Dog extends Animal
14+
15+
type Mammal = Cat.type | Dog.type
16+
val mammals: List[Mammal] = ???
17+
18+
class Work[F4[_]](random: Random[F4])(using mf: Monad[F4]):
19+
def result1: F4[Mammal] =
20+
mf.map(fa = random.element(mammals))(a => a)
21+
22+
def result2: F4[Mammal] = Monad.map(random.element(mammals))(a => a)
23+
24+
import Monad.*
25+
26+
def result3: F4[Mammal] = random
27+
.element(mammals)
28+
.map { a =>
29+
a // was: Type Mismatch Error:
30+
// Found: (a : Animal)
31+
// Required: Cat.type | Dog.type
32+
}

0 commit comments

Comments
 (0)