Skip to content

Regression in apache/incubator-pekko-connectors #19479

Closed
@WojciechMazur

Description

@WojciechMazur

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.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions