diff --git a/library/src/scala/quoted/ToExpr.scala b/library/src/scala/quoted/ToExpr.scala index 39dcf01ef3a1..5d070f03eb18 100644 --- a/library/src/scala/quoted/ToExpr.scala +++ b/library/src/scala/quoted/ToExpr.scala @@ -81,10 +81,10 @@ object ToExpr { } /** Default implemetation of `ToExpr[Class[T]]` */ - given ClassToExpr[T]: ToExpr[Class[T]] with { - def apply(x: Class[T])(using Quotes) = { + given ClassToExpr[T <: Class[?]]: ToExpr[T] with { + def apply(x: T)(using Quotes) = { import quotes.reflect._ - Ref(defn.Predef_classOf).appliedToType(TypeRepr.typeConstructorOf(x)).asExpr.asInstanceOf[Expr[Class[T]]] + Ref(defn.Predef_classOf).appliedToType(TypeRepr.typeConstructorOf(x)).asExpr.asInstanceOf[Expr[T]] } } diff --git a/tests/run-macros/quoted-toExprOfClass.check b/tests/run-macros/quoted-toExprOfClass.check new file mode 100644 index 000000000000..a26aa9ec6809 --- /dev/null +++ b/tests/run-macros/quoted-toExprOfClass.check @@ -0,0 +1,4 @@ +long +int +int +int diff --git a/tests/run-macros/quoted-toExprOfClass/Macros_1.scala b/tests/run-macros/quoted-toExprOfClass/Macros_1.scala new file mode 100644 index 000000000000..0b9f33f5ddbc --- /dev/null +++ b/tests/run-macros/quoted-toExprOfClass/Macros_1.scala @@ -0,0 +1,20 @@ +import scala.quoted._ + +inline def wildcard: Map[String, Class[?]] = ${ wildcardMacro } +inline def noWildcard: Map[String, Class[Int]] = ${ noWildcardMacro } + +def wildcardMacro(using Quotes): Expr[Map[String, Class[?]]] = { + val result: Map[String, Class[?]] = Map( + "foo" -> classOf[Long], + "bar" -> classOf[Int] + ) + Expr(result) +} + +def noWildcardMacro(using Quotes): Expr[Map[String, Class[Int]]] = { + val result: Map[String, Class[Int]] = Map( + "foo" -> classOf[Int], + "bar" -> classOf[Int] + ) + Expr(result) +} diff --git a/tests/run-macros/quoted-toExprOfClass/Test_2.scala b/tests/run-macros/quoted-toExprOfClass/Test_2.scala new file mode 100644 index 000000000000..eb64a083dcb6 --- /dev/null +++ b/tests/run-macros/quoted-toExprOfClass/Test_2.scala @@ -0,0 +1,10 @@ +object Test { + def main(args: Array[String]): Unit = { + val a: Map[String, Class[?]] = wildcard + val b: Map[String, Class[Int]] = noWildcard + println(a("foo")) + println(a("bar")) + println(b("foo")) + println(b("bar")) + } +}