Skip to content

Typer regression in otavia-projects/otavia under -Yexplicit-nulls #19844

Closed as not planned
@WojciechMazur

Description

@WojciechMazur

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions