Skip to content

Implicit search assertion failed in macro, in combination with implicits defined in Scala 2 #11628

Closed
@jodersky

Description

@jodersky

Compiler version

3.0.0-RC1 (also happens on dotty master, which as of this writing is 3.0.0-RC2-bin-SNAPSHOT-nonbootstrapped-git-086d1a8)

Minimized code

macros.scala:

// assume that this conversion utility is defined in Scala 2
class Scala2Conversion[T, V](val f: T => V)
object Scala2Conversion{
  implicit def create[T, V](implicit f: T => V): Scala2Conversion[T, V] = new Scala2Conversion(f)
}

// assume this utility in Scala 3, to summon a conversion within a macro
import quoted._
def summonConversionImpl(using qctx: Quotes): Expr[Any] = {
  import qctx.reflect._

  // hardcoded in this example to look for String to Int
  val conversionTpe = TypeRepr.of[Scala2Conversion[String, Int]]

  Implicits.search(conversionTpe) match {
    case iss: ImplicitSearchSuccess =>
      iss.tree.asExpr
    case isf: ImplicitSearchFailure =>
      report.error(s"can't find conversion")
      '{???}
  }
}

inline def summonConversion() = ${summonConversionImpl}

main.scala:

implicit def s2i(x: String): Int = x.toInt

def main() = {
  summonConversion()
}

Output (click arrow to expand)

[error] 5 |  summonConversion()
[error]   |  ^^^^^^^^^^^^^^^^^^
[error]   |Exception occurred while executing macro expansion.
[error]   |java.lang.AssertionError: assertion failed
[error]   |     at scala.runtime.Scala3RunTime$.assertFailed(Scala3RunTime.scala:11)
[error]   |     at dotty.tools.dotc.typer.EtaExpansion$.etaExpand(EtaExpansion.scala:226)
[error]   |     at dotty.tools.dotc.typer.Typer.adaptNoArgsUnappliedMethod$2(Typer.scala:3379)
[error]   |     at dotty.tools.dotc.typer.Typer.adaptNoArgs$1(Typer.scala:3524)
[error]   |     at dotty.tools.dotc.typer.Typer.adapt1(Typer.scala:3747)
[error]   |     at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:3054)
[error]   |     at dotty.tools.dotc.typer.Implicits.typedImplicit(Implicits.scala:1013)
[error]   |     at dotty.tools.dotc.typer.Implicits.typedImplicit$(Implicits.scala:760)
[error]   |     at dotty.tools.dotc.typer.Typer.typedImplicit(Typer.scala:102)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.tryImplicit(Implicits.scala:1108)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.rank$1(Implicits.scala:1180)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:1289)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:1296)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1329)
[error]   |     at dotty.tools.dotc.typer.Implicits.inferImplicit(Implicits.scala:965)
[error]   |     at dotty.tools.dotc.typer.Implicits.inferImplicit$(Implicits.scala:760)
[error]   |     at dotty.tools.dotc.typer.Typer.inferImplicit(Typer.scala:102)
[error]   |     at dotty.tools.dotc.typer.Implicits.inferImplicitArg(Implicits.scala:834)
[error]   |     at dotty.tools.dotc.typer.Implicits.inferImplicitArg$(Implicits.scala:760)
[error]   |     at dotty.tools.dotc.typer.Typer.inferImplicitArg(Typer.scala:102)
[error]   |     at dotty.tools.dotc.typer.Typer.implicitArgs$1(Typer.scala:3214)
[error]   |     at dotty.tools.dotc.typer.Typer.addImplicitArgs$3(Typer.scala:3250)
[error]   |     at dotty.tools.dotc.typer.Typer.adaptNoArgsImplicitMethod$2(Typer.scala:3326)
[error]   |     at dotty.tools.dotc.typer.Typer.adaptNoArgs$1(Typer.scala:3504)
[error]   |     at dotty.tools.dotc.typer.Typer.adapt1(Typer.scala:3747)
[error]   |     at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:3054)
[error]   |     at dotty.tools.dotc.typer.Typer.readapt$1(Typer.scala:3065)
[error]   |     at dotty.tools.dotc.typer.Typer.adapt1(Typer.scala:3734)
[error]   |     at dotty.tools.dotc.typer.Typer.adapt(Typer.scala:3054)
[error]   |     at dotty.tools.dotc.typer.Implicits.typedImplicit(Implicits.scala:1013)
[error]   |     at dotty.tools.dotc.typer.Implicits.typedImplicit$(Implicits.scala:760)
[error]   |     at dotty.tools.dotc.typer.Typer.typedImplicit(Typer.scala:102)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.tryImplicit(Implicits.scala:1108)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.rank$1(Implicits.scala:1180)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:1289)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:1296)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.searchImplicit(Implicits.scala:1304)
[error]   |     at dotty.tools.dotc.typer.Implicits$ImplicitSearch.bestImplicit(Implicits.scala:1329)
[error]   |     at dotty.tools.dotc.typer.Implicits.inferImplicit(Implicits.scala:965)
[error]   |     at dotty.tools.dotc.typer.Implicits.inferImplicit$(Implicits.scala:760)
[error]   |     at dotty.tools.dotc.typer.Typer.inferImplicit(Typer.scala:102)
[error]   |     at dotty.tools.dotc.typer.Implicits.inferImplicitArg(Implicits.scala:834)
[error]   |     at dotty.tools.dotc.typer.Implicits.inferImplicitArg$(Implicits.scala:760)
[error]   |     at dotty.tools.dotc.typer.Typer.inferImplicitArg(Typer.scala:102)
[error]   |     at scala.quoted.runtime.impl.QuotesImpl$reflect$Implicits$.search(QuotesImpl.scala:2332)
[error]   |     at scala.quoted.runtime.impl.QuotesImpl$reflect$Implicits$.search(QuotesImpl.scala:2331)
[error]   |     at macros$package$.summonConversionImpl(macros.scala:16)
[error]   |
[error]   | This location contains code that was inlined from main.scala:5

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions