Skip to content

Compiler does not try transparent macro method if it expects an aux type #24114

@Katrix

Description

@Katrix

Compiler version

3.8.0-RC1-bin-20251001-28a4921-NIGHTLY
Latest nightly at the time of writing

Minimized code

shapeless.scala

package shapeless {
  sealed trait HList
  final case class ::[+H, +T <: HList](head: H, tail: T) extends HList
  sealed trait HNil extends HList
  case object HNil extends HNil

  trait Default[T] {
    type Out <: HList
  }

  object Default {
    type Aux[T, Out0 <: HList] = Default[T] {type Out = Out0}

    transparent inline given materialize[T]: Default[T] = ${ defaultImpl[T] }

    import scala.quoted.*

    def defaultImpl[T: Type](using quotes: Quotes): Expr[Default[T]] = {
      import quotes.reflect.*
      val tpe = TypeRepr.of[T]

      if (tpe <:< TypeRepr.of[test.CC]) '{
        new Default[T] {
          type Out = None.type :: Some[String] :: Some[Option[Boolean]] :: HNil
        }
      } else quotes.reflect.report.errorAndAbort(s"No default implementation for ${tpe.show}")
    }
  }
}

main.scala

//> using scala 3.8.0-RC1-bin-20251001-28a4921-NIGHTLY
//> using option -Yretain-trees

package test

import shapeless.*

case class CC(a: Int, b: String = "c", c: Option[Boolean] = Some(false))

val foo1: Default.Aux[CC, None.type :: Some[String] :: Some[Option[Boolean]] :: HNil] = summon[Default[CC]]

// Does not compile
val foo2: Default.Aux[CC, None.type :: Some[String] :: Some[Option[Boolean]] :: HNil] = summon[Default.Aux[CC, None.type :: Some[String] :: Some[Option[Boolean]] :: HNil]]

Output

[error] .\main.scala:11:172
[error] No given instance of type shapeless.Default.Aux[test.CC, None.type :: Some[String] ::
[error]   Some[Option[Boolean]] :: shapeless.HNil] was found for parameter x of method summon in object Predef
[error] val foo2: Default.Aux[CC, None.type :: Some[String] :: Some[Option[Boolean]] :: HNil] = summon[Default.Aux[CC, None.type :: Some[String] :: Some[Option[Boolean]] :: HNil]]
[error]      

Expectation

It compiles. It seems like the compiler doesn't even try the macro, maybe because the type doesn't completely match up with what it expects.

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