diff --git a/tests/neg-macros/i19842.check b/tests/neg-macros/i19842.check new file mode 100644 index 000000000000..b22efc51a94a --- /dev/null +++ b/tests/neg-macros/i19842.check @@ -0,0 +1,32 @@ +-- Error: tests/neg-macros/i19842/Test.scala:9:50 ---------------------------------------------------------------------- +9 |@main def Test = summon[Serializer[ValidationCls]] // error + | ^ + |Malformed tree was found while expanding macro with -Xcheck-macros. + |The tree does not conform to the compiler's tree invariants. + | + |Macro was: + |scala.quoted.runtime.Expr.splice[Serializer[ValidationCls]](((contextual$2: scala.quoted.Quotes) ?=> Macros.makeSerializer[ValidationCls](scala.quoted.Type.of[ValidationCls](contextual$2), contextual$2))) + | + |The macro returned: + |{ + | object objectSerializer$macro$1 extends Serializer[ValidationCls] { this: objectSerializer$macro$1.type => + | + | } + | objectSerializer$macro$1 + |} + | + |Error: + |assertion failed: Parents of class symbol differs from the parents in the tree for object objectSerializer$macro$1 + | + |Parents in symbol: [class Object, trait Serializer] + |Parents in tree: [trait Serializer] + | + | + |stacktrace available when compiling with `-Ydebug` + |--------------------------------------------------------------------------------------------------------------------- + |Inline stack trace + |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + |This location contains code that was inlined from Test.scala:5 +5 | implicit inline def implicitMakeSerializer[T]: Serializer[T] = ${ Macros.makeSerializer[T] } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + --------------------------------------------------------------------------------------------------------------------- diff --git a/tests/neg-macros/i19842/Macro.scala b/tests/neg-macros/i19842/Macro.scala new file mode 100644 index 000000000000..481c0b2468b0 --- /dev/null +++ b/tests/neg-macros/i19842/Macro.scala @@ -0,0 +1,29 @@ + +import scala.annotation.{experimental, targetName} +import scala.quoted.* +import scala.util.Try + +object Macros { + def makeSerializer[T: Type](using Quotes): Expr[Serializer[T]] = { + import quotes.reflect.* + + val tpe: TypeRepr = TypeRepr.of[T] + val name: String = Symbol.freshName("objectSerializer") + + val modSym: Symbol = Symbol.newModule( + Symbol.spliceOwner, + name, + Flags.Implicit, + Flags.EmptyFlags, + // Without TypeRep.of[Object] it would fail with java.lang.AssertionError: assertion failed: First parent must be a class + List(TypeRepr.of[Object], TypeRepr.of[Serializer[T]]), + _ => Nil, + Symbol.noSymbol + ) + + val (modValDef: ValDef, modClassDef: ClassDef) = + ClassDef.module(modSym, List(TypeTree.of[Serializer[T]]), Nil) + + Block(List(modValDef, modClassDef), Ref(modSym)).asExprOf[Serializer[T]] + } +} \ No newline at end of file diff --git a/tests/neg-macros/i19842/Test.scala b/tests/neg-macros/i19842/Test.scala new file mode 100644 index 000000000000..ba1611d97696 --- /dev/null +++ b/tests/neg-macros/i19842/Test.scala @@ -0,0 +1,9 @@ + +trait Serializer[@specialized T] + +object Serializer: + implicit inline def implicitMakeSerializer[T]: Serializer[T] = ${ Macros.makeSerializer[T] } + +case class ValidationCls(string: String) + +@main def Test = summon[Serializer[ValidationCls]] // error \ No newline at end of file