Skip to content

Typer regression for path dependent types in kasiamarek/tyre-scala #24094

@WojciechMazur

Description

@WojciechMazur

Based on the OpenCB failure in kasiamarek/tyre-scala - build logs

Compiler version

Last good release: 3.8.0-RC1-bin-20250915-afbb66b-NIGHTLY
First bad release: 3.8.0-RC1-bin-20250916-eb1bb73-NIGHTLY
Bisect points to b1067d9 / #23923

Minimized code

class TyreCompiler[IN <: Tuple, R](val context: Context[R *: IN]):
  import context.*

  private class Loop[IS <: Tuple, T](
      val context: Context[T *: IS],
      innerAutomaton: context.Automaton[IS]
  ) {
    lazy val fixableStates: List[RefinedInitNonAcceptingState[T, IS]] =
      innerAutomaton.initStates.map { case is: context.InitNonAcceptingState[?] =>
        new RefinedInitNonAcceptingState[T, IS] {
          type Tail = is.OS
          type OS = List[T] *: Tail
          lazy val state = new NonAcceptingState:
            val next: List[Transition[OS]] =
              is.state.next.flatMap(fixTransition[is.OS](fixableStates, _))
        }
      }

    private def fixTransition[S <: Tuple](
        initStates: List[RefinedInitNonAcceptingState[T, IS]],
        transition: context.Transition[S]
    ): List[Transition[List[T] *: S]] = ???

    private trait RefinedInitNonAcceptingState[T, IS <: Tuple] extends InitNonAcceptingState[IS]:
      type Tail <: Tuple
      type OS = List[T] *: Tail
      lazy val state: NonAcceptingState[OS]
  }

private class Context[R <: Tuple]:
  sealed trait State[S <: Tuple]:
    val next: List[Transition[S]]
  trait NonAcceptingState[S <: Tuple] extends State[S]

  sealed trait Transition[IS <: Tuple]:
    def state: State[?]

  sealed trait InitState[-IS <: Tuple]:
    type OS <: Tuple
    def state: State[?]

  trait InitNonAcceptingState[-IS <: Tuple] extends InitState[IS]:
    lazy val state: NonAcceptingState[OS]

  trait Automaton[-IS <: Tuple]:
    val initStates: List[InitState[IS]]

Output

-- [E007] Type Mismatch Error: /Users/wmazur/projects/scala/community-build3/test.scala:16:74 -----------------------------------------------------------------------------------------------
16 |                is.state.next.flatMap(fixTransition[is.OS](fixableStates, _))
   |                                                                          ^
   |                                                                   Found:    (_$1 : Context.this.Transition[? >: Context.this.State[?]#S | is.OS <: Context.this.State[?]#S & is.OS])
   |                                                                   Required: Loop.this.context.Transition[is.OS]
   |
   | longer explanation available when compiling with `-explain`

Expectation

Should compile

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions