- 
                Notifications
    You must be signed in to change notification settings 
- Fork 1.1k
Closed
Description
Compiler version
3.0.1
Minimized code
fileA.scala
object Opaque {
  opaque type FieldType[K, +V] <: V = V
}fileB.scala
import Opaque.*
object Test {
  type FindField[R <: scala.Tuple, K] = R match {
    case FieldType[K, f] *: t => f
    case _ *: t => FindField[t, K]
  }
  val f: FieldType["A", Int] = ???
  val f1: Int = f
  //val f2: Int = f
  type R = FieldType["A", Int] *: FieldType["B", Double] *: FieldType["C", String] *: FieldType["D", Boolean] *: EmptyTuple
  summon[FindField[R, "B"] =:= Double]
}Steps to reproduce
- Compile both files together in a project. Everything should compile fine.
- Uncomment val f2: Int = f
- Try to compile again (and not cleaning beforehand). It will error for f1,f2, and the summon
- Clean and compile. It works again
Output
[error] -- [E007] Type Mismatch Error: D:\DevProjects\Stable\shapeless\core\src\main\scala-3\fileB.scala:10:16
[error] 10 |  val f1: Int = f
[error]    |                ^
[error]    |              Found:    (Test.f : Opaque.FieldType[("A" : String), Int])
[error]    |              Required: Int
[error] -- [E007] Type Mismatch Error: D:\DevProjects\Stable\shapeless\core\src\main\scala-3\fileB.scala:11:16
[error] 11 |  val f2: Int = f
[error]    |                ^
[error]    |              Found:    (Test.f : Opaque.FieldType[("A" : String), Int])
[error]    |              Required: Int
[error] -- Error: D:\DevProjects\Stable\shapeless\core\src\main\scala-3\fileB.scala:14:38
[error] 14 |  summon[FindField[R, "B"] =:= Double]
[error]    |                                      ^
[error]    |Cannot prove that Test.FindField[Test.R, ("B" : String)] =:= Double.
[error]    |
[error]    |One of the following imports might make progress towards fixing the problem:
[error]    |
[error]    |  import shapeless.~?>.idKeyWitness
[error]    |  import shapeless.~?>.idValueWitness
[error]    |  import shapeless.~?>.witness
[error]    |
[error]    |
[error]    |
[error]    |Note: a match type could not be fully reduced:
[error]    |
[error]    |  trying to reduce  Test.FindField[Test.R, ("B" : String)]
[error]    |  failed since selector  Test.R
[error]    |  does not match  case Opaque.FieldType[("B" : String), f] *: t => f
[error]    |  and cannot be shown to be disjoint from it either.
[error]    |  Therefore, reduction cannot advance to the remaining case
[error]    |
[error]    |    case _ *: t => Test.FindField[t, ("B" : String)]Expectation
It should compile in both cases, also when using incremental compilation.