Skip to content

Unexpected New (...) reached GenBCode #16357

Closed
@kubukoz

Description

@kubukoz

Compiler version

3.2.1

Minimized code

macros.scala

//> using scala "3.2.1"
import scala.quoted._
import scala.annotation.experimental

object macros {

  trait Suspend[A[_[_]]] {
    def sus[F[_]](fa: F[A[F]]): A[F]
  }

  inline def mkSuspend[Alg[_[_]]]: Suspend[Alg] = ${ mkSuspendImpl[Alg] }

  @experimental
  def mkSuspendImpl[Alg[_[_]]: Type](using Quotes): Expr[Suspend[Alg]] = {
    import quotes.reflect._
    def instance[F[_]: Type](fExpr: Expr[F[Alg[F]]]): Expr[Alg[F]] = {
      val cl = Symbol.newClass(
        Symbol.spliceOwner,
        "$anon",
        parents = List(
          TypeRepr.of[Object],
          TypeRepr.of[Alg].appliedTo(TypeRepr.of[F]),
        ),
        decls = _ => Nil,
        selfType = None,
      )

      val tree = New(
        TypeTree.of[Alg]
      )

      Block(
        List(
          ClassDef(cl, Nil, Nil)
        ),
        New(
          TypeTree.ref(cl)
        ),
      ).asExprOf[Alg[F]]
    }

    '{
      new Suspend[Alg] {
        def sus[F[_]](fa: F[Alg[F]]): Alg[F] = ${ instance('fa) }
      }
    }
  }

}

main.scala

//> using scala "3.2.1"
import macros.Suspend

object demo extends App {

  trait MyAlg[F[_]] {
    def hello(s: String): F[Int] = ???
  }

  macros.mkSuspend[MyAlg]
}

Output (click arrow to expand)

Error: Unexpected New(... with ... {...}/TypeTree[TypeRef(NoPrefix,class demo$$anon$2)]) reached GenBCode.
  Call was genLoad(New(TypeTree[TypeRef(NoPrefix,class demo$$anon$2)]),Ldemo$MyAlg;)
Error compiling project (Scala 3.2.1, JVM)
Error: Unexpected error when compiling project_f0e8bc45bf: 'Unexpected New(... with ... {...}/TypeTree[TypeRef(NoPrefix,class demo$$anon$2)]) reached GenBCode.
  Call was genLoad(New(TypeTree[TypeRef(NoPrefix,class demo$$anon$2)]),Ldemo$MyAlg;)'
Compilation failed

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions