Skip to content

transparent implicit conversion macro not emitting the proper error #12429

Closed as not planned
@soronpo

Description

@soronpo

Among various inlining and macro usages, only transparent macro does not emit the error message reported inside.

Compiler version

3.0 master branch

Minimized code

Main code:

import scala.language.implicitConversions
inline def inlineError : Unit =
  compiletime.error("inlineError")
transparent inline def transparentInlineError : Unit =
  compiletime.error("transparentInlineError")

trait InlineConversion
object InlineConversion:
  inline implicit def fromInt(i : Int) : InlineConversion =
    compiletime.error("inlineConversionError")

trait TransparentInlineConversion
object TransparentInlineConversion:
  transparent inline implicit def fromInt(i : Int) : TransparentInlineConversion =
    compiletime.error("transparentInlineConversionError")

import scala.quoted.*

inline def macroError : Unit = ${macroErrorInternal}
def macroErrorInternal(using Quotes) : Expr[Unit] =
  import quotes.reflect.*
  report.error("macroError")
  '{}

transparent inline def transparentMacroError : Unit = ${transparentMacroErrorInternal}
def transparentMacroErrorInternal(using Quotes) : Expr[Unit] =
  import quotes.reflect.*
  report.error("transparentMacroError")
  '{}

trait MacroConversion
object MacroConversion:
  inline implicit def fromInt(i : Int) : MacroConversion = ${fromIntInternal}
  def fromIntInternal(using Quotes) : Expr[MacroConversion] =
    import quotes.reflect.*
    report.error("macroConversionError")
    '{???}
trait TransparentMacroConversion
object TransparentMacroConversion:
  transparent inline implicit def fromInt(i : Int) : TransparentMacroConversion = ${fromIntInternal}
  def fromIntInternal(using Quotes) : Expr[TransparentMacroConversion] =
    import quotes.reflect.*
    report.error("transparentMacroConversionError")
    '{???}

Test code:

object Test {
  inlineError //error: inlineError 
  transparentInlineError //error: transparentInlineError 
  val i1 : InlineConversion = 1 //error: inlineConversionError
  val i2 : TransparentInlineConversion = 2 //error: transparentInlineConversionError
  macroError //error: macroError 
  transparentMacroError //error: transparentMacroError 
  val i3 : MacroConversion = 3 //error: macroConversionError
  val i4 : TransparentMacroConversion = 4 //Found:    (4 : Int)  Required: TransparentMacroConversion                              
}

Output

transparentMacroError
  transparentMacroError

Found:    (4 : Int)
Required: TransparentMacroConversion
  val i4 : TransparentMacroConversion = 4

Expectation

The last error should be "transparentMacroConversionError", instead of the type mismatch error.
Note: the transparent macro errors are emitted first. Once commented out, we can see the other errors properly emitted.

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