From cc55175bd9b4fc04d47448c15d0a68401f01e3d2 Mon Sep 17 00:00:00 2001 From: Dale Wijnand Date: Thu, 12 Oct 2023 11:01:46 +0100 Subject: [PATCH] Propagate hard vars when replacing Constraint params --- .../tools/dotc/core/OrderingConstraint.scala | 3 ++ tests/pos/i18626.scala | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 tests/pos/i18626.scala diff --git a/compiler/src/dotty/tools/dotc/core/OrderingConstraint.scala b/compiler/src/dotty/tools/dotc/core/OrderingConstraint.scala index 50e9ac953954..7b94eb3f67d3 100644 --- a/compiler/src/dotty/tools/dotc/core/OrderingConstraint.scala +++ b/compiler/src/dotty/tools/dotc/core/OrderingConstraint.scala @@ -748,6 +748,9 @@ class OrderingConstraint(private val boundsMap: ParamBounds, } if isRemovable(param.binder) then current = current.remove(param.binder) current.dropDeps(param) + replacedTypeVar match + case replacedTypeVar: TypeVar if isHard(replacedTypeVar) => current = current.hardenTypeVars(replacement) + case _ => current.checkWellFormed() end replace diff --git a/tests/pos/i18626.scala b/tests/pos/i18626.scala new file mode 100644 index 000000000000..0fda265f3812 --- /dev/null +++ b/tests/pos/i18626.scala @@ -0,0 +1,32 @@ +trait Random[F1[_]]: + def element[T1](list: Seq[T1]): F1[T1] = ??? + +trait Monad[F2[_]]: + def map[A1, B1](fa: F2[A1])(f: A1 => B1): F2[B1] + +object Monad: + extension [F3[_]: Monad, A3](fa: F3[A3]) + def map[B3](f: A3 => B3): F3[B3] = ??? + +sealed trait Animal +object Cat extends Animal +object Dog extends Animal + +type Mammal = Cat.type | Dog.type +val mammals: List[Mammal] = ??? + +class Work[F4[_]](random: Random[F4])(using mf: Monad[F4]): + def result1: F4[Mammal] = + mf.map(fa = random.element(mammals))(a => a) + + def result2: F4[Mammal] = Monad.map(random.element(mammals))(a => a) + + import Monad.* + + def result3: F4[Mammal] = random + .element(mammals) + .map { a => + a // was: Type Mismatch Error: + // Found: (a : Animal) + // Required: Cat.type | Dog.type +}