diff --git a/compiler/src/dotty/tools/dotc/quoted/Runners.scala b/compiler/src/dotty/tools/dotc/quoted/Runners.scala index bdb9e3d48c7c..c9560c5d2de3 100644 --- a/compiler/src/dotty/tools/dotc/quoted/Runners.scala +++ b/compiler/src/dotty/tools/dotc/quoted/Runners.scala @@ -3,11 +3,11 @@ package dotty.tools.dotc.quoted import dotty.tools.dotc.ast.Trees._ import dotty.tools.dotc.ast.tpd import dotty.tools.dotc.core.Constants._ -import dotty.tools.dotc.core.Contexts._ import dotty.tools.dotc.printing.RefinedPrinter import scala.quoted.Expr import scala.quoted.Liftable.ConstantExpr +import scala.runtime.BoxedUnit import scala.runtime.quoted._ /** Default runners for quoted expressions */ @@ -23,7 +23,8 @@ object Runners { implicit val ctx = new QuoteDriver().initCtx ctx.settings.color.update("never") val printer = new RefinedPrinter(ctx) - printer.toText(Literal(Constant(expr.value))).mkString(Int.MaxValue, false) + if (expr.value == BoxedUnit.UNIT) "()" + else printer.toText(Literal(Constant(expr.value))).mkString(Int.MaxValue, false) case _ => new QuoteDriver().show(expr) } diff --git a/library/src/scala/quoted/Liftable.scala b/library/src/scala/quoted/Liftable.scala index 2a13d6c375b5..a802dda0bd22 100644 --- a/library/src/scala/quoted/Liftable.scala +++ b/library/src/scala/quoted/Liftable.scala @@ -22,6 +22,7 @@ object Liftable { override def toString: String = s"Expr($value)" } + implicit def UnitIsLiftable: Liftable[Unit] = (x: Unit) => new ConstantExpr(x) implicit def BooleanIsLiftable: Liftable[Boolean] = (x: Boolean) => new ConstantExpr(x) implicit def ByteLiftable: Liftable[Byte] = (x: Byte) => new ConstantExpr(x) implicit def CharIsLiftable: Liftable[Char] = (x: Char) => new ConstantExpr(x) diff --git a/tests/pos/quote-liftable.scala b/tests/pos/quote-liftable.scala index 0388a1da6432..fd4f12d26b41 100644 --- a/tests/pos/quote-liftable.scala +++ b/tests/pos/quote-liftable.scala @@ -33,6 +33,7 @@ object Test { (1.0f: Expr[Float]) (1.0: Expr[Double]) ("abc": Expr[String]) + ((): Expr[Unit]) val xs: Expr[List[Int]] = 1 :: 2 :: 3 :: Nil } diff --git a/tests/run-with-compiler/i3946.check b/tests/run-with-compiler/i3946.check new file mode 100644 index 000000000000..c5c5ef49d498 --- /dev/null +++ b/tests/run-with-compiler/i3946.check @@ -0,0 +1,2 @@ +() +() diff --git a/tests/run-with-compiler/i3946.scala b/tests/run-with-compiler/i3946.scala new file mode 100644 index 000000000000..3bf49ce357c5 --- /dev/null +++ b/tests/run-with-compiler/i3946.scala @@ -0,0 +1,9 @@ +import dotty.tools.dotc.quoted.Runners._ +import scala.quoted._ +object Test { + def main(args: Array[String]): Unit = { + val u: Expr[Unit] = () + println(u.show) + println(u.run) + } +}