Closed
Description
Based on OpenCB build failure in apache/incubator-pekko-connectors
- build logs
Compiler version
Last good release: 3.4.0-RC1-bin-20231212-97e4401-NIGHTLY
First bad release: 3.4.0-RC1-bin-20231213-9dce045-NIGHTLY
Present in 3.4.0-RC1
Bisect points to d6c7e18
Minimized code
case class Person(id: Int)
class GeodeContinuousSourceSpec {
summon[PdxEncoder[Person]]
}
trait PdxEncoder[A] {
def encode(a: A): Boolean
}
object PdxEncoder extends ObjectEncoder {
implicit def intEncoder: PdxEncoder[Int] = ???
}
trait ObjectEncoder {
given emptyTupleEncoder: PdxEncoder[EmptyTuple] = ???
given tupleEncoder[K <: String, H, T <: Tuple](using
m: ValueOf[K],
hEncoder: PdxEncoder[H],
tEncoder: PdxEncoder[T]
): PdxEncoder[FieldType[K, H] *: T] = ???
given objectEncoder[A, Repr <: Tuple](using
gen: LabelledGeneric.Aux[A, Repr],
tupleEncoder: PdxEncoder[Repr]
): PdxEncoder[A] = ???
}
import scala.deriving.Mirror
private type FieldType[K, +V] = V & KeyTag[K, V]
private type KeyTag[K, +V]
private type ZipWith[T1 <: Tuple, T2 <: Tuple, F[_, _]] <: Tuple = (T1, T2) match {
case (h1 *: t1, h2 *: t2) => F[h1, h2] *: ZipWith[t1, t2, F]
case (EmptyTuple, ?) => EmptyTuple
case (?, EmptyTuple) => EmptyTuple
case _ => Tuple
}
private trait LabelledGeneric[A] {
type Repr
}
private object LabelledGeneric {
type Aux[A, R] = LabelledGeneric[A] { type Repr = R }
inline given productInst[A <: Product](using
m: Mirror.ProductOf[A]
): LabelledGeneric.Aux[A, ZipWith[m.MirroredElemLabels, m.MirroredElemTypes, FieldType]] =
new LabelledGeneric[A] {
type Repr = Tuple & ZipWith[m.MirroredElemLabels, m.MirroredElemTypes, FieldType]
}
}
Output
-- [E172] Type Error: /Users/wmazur/projects/sandbox/main.scala:4:28 -----------
4 | summon[PdxEncoder[Person]]
| ^
|No given instance of type PdxEncoder[Person] was found for parameter x of method summon in object Predef.
|I found:
|
| PdxEncoder.objectEncoder[Person, Repr](
| LabelledGeneric.productInst[Person](
| Person.$asInstanceOf[
|
| scala.deriving.Mirror.Product{
| type MirroredMonoType = Person; type MirroredType = Person;
| type MirroredLabel = ("Person" : String);
| type MirroredElemTypes = Int *: EmptyTuple.type;
| type MirroredElemLabels = ("id" : String) *: EmptyTuple.type
| }
|
| ]
| ),
| ???)
|
|But given instance productInst in object LabelledGeneric does not match type LabelledGeneric.Aux[Person, Repr].
1 error found
Expectation
Not sure if it's false negative or not. Needs confirmation it works as expected or to provide a fix.