Closed as not planned
Description
Code no longer compiles when -Yexplicit-nulls
is used.
Based on Open CB failure of otavia-projects/otavia
- build logs
Compiler version
3.4.0
Last good release: 3.3.2-RC1-bin-20230605-348729e-NIGHTLY
First bad release: 3.3.2-RC1-bin-20230606-5d2812a-NIGHTLY
Bisect points to 3e1fbd6
Minimized code
//> using options -Yexplicit-nulls
sealed trait Message extends Serializable
type MessageOf[A <: Actor[?]] <: Call = A match {
case Actor[m] => m
}
sealed trait Call extends Message
trait Ask[R <: Reply] extends Call
type ReplyOf[A <: Ask[? <: Reply]] <: Reply = A match
case Ask[r] => r
trait Reply extends Message
sealed trait UnitReply private () extends Reply
trait Future[+V]
sealed trait MessageFuture[+R <: Reply] extends Future[R]
trait Actor[+M <: Call]
trait Address[-M <: Call]: // extends EventableAddress {
def send[A <: M & Ask[? <: Reply]](send: A): Unit
def ask[A <: M & Ask[? <: Reply]](ask: A, future: MessageFuture[ReplyOf[A]]): MessageFuture[ReplyOf[A]]
final case class AcceptedChannel() extends Ask[UnitReply]
abstract class AcceptedWorkerActor[M <: Call] extends Actor[M | AcceptedChannel]
abstract class AcceptorActor[W <: AcceptedWorkerActor[? <: Call]]{
private var workers: Address[MessageOf[W]] = ???
def future: MessageFuture[UnitReply] = ???
def case1 = workers.send(AcceptedChannel()) // error
def case2 = workers.ask(AcceptedChannel(), future) // error
}
Output
Compiling project (Scala 3.4.0, JVM (17))
[error] ./bisect/main.scala:32:30
[error] Found: AcceptedChannel
[error] Required: MessageOf[W] & Ask[? <: Reply]
[error] def case1 = workers.send(AcceptedChannel()) // error
[error] ^^^^^^^^^^^^^^^^^
[error] ./bisect/main.scala:33:29
[error] Found: AcceptedChannel
[error] Required: MessageOf[W] & Ask[? <: Reply]
[error] def case2 = workers.ask(AcceptedChannel(), future) // error
[error] ^^^^^^^^^^^^^^^^^
[error] ./bisect/main.scala:33:48
[error] Found: MessageFuture[UnitReply]
[error] Required: MessageFuture[ReplyOf[A]]
[error]
[error] where: A is a type variable with constraint <: MessageOf[W] & Ask[? <: Reply]
[error]
[error]
[error] Note: a match type could not be fully reduced:
[error]
[error] trying to reduce ReplyOf[A]
[error] failed since selector W
[error] does not uniquely determine parameter m in
[error] case Actor[m] => m
[error] The computed bounds for the parameter are:
[error] m <: Call | AcceptedChannel
[error] def case2 = workers.ask(AcceptedChannel(), future) // error
[error] ^^^^^^
Error compiling project (Scala 3.4.0, JVM (17))
Expectation
Should probably compile