Skip to content

Narrowing the type of MirroredElemLabels is not equivalent to using <:< #20307

Open
@arainko

Description

@arainko

Compiler version

3.4.1, 3.5.0-RC1-bin-20240429-e2c456f-NIGHTLY

Minimized code

//> using scala 3.4.1

import scala.deriving.Mirror

enum YesNo {
  case Yes, No
}

enum NoYes {
  case No, Yes
}


object Repro {
  def derived[A](using A: Mirror.SumOf[A] { type MirroredElemLabels = ("Yes", "No") }) = ???

  def derivedWithEvidence[A](using A: Mirror.SumOf[A], ev: A.MirroredElemLabels <:< ("Yes", "No")) = ???

  derived[YesNo] // compiles, as expected
  derived[NoYes] // compiles, yet NoYes.MirroredElemLabels is ("No", "Yes")

  derivedWithEvidence[YesNo] // compiles, as expected
  // derivedWithEvidence[NoYes] // compilation fails, as expected
}

Expectation

I'd expect derived[NoYes] (just like derivedWithEvidence[NoYes]) to fail the compilation since its MirroredElemLabels is ("No", "Yes) but the method's A argument refined to only allow ("Yes", "No")

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions