From 251f6546fa8c7bb00171de5e27e0d3a907e89872 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Tue, 2 Oct 2018 00:58:52 +0200 Subject: [PATCH] Fix varargs interpretation --- compiler/src/dotty/tools/dotc/transform/Splicer.scala | 10 +++++++++- compiler/test/dotc/run-test-pickling.blacklist | 1 + tests/run/inline-varargs-1.check | 1 + tests/run/inline-varargs-1/Macro_1.scala | 6 ++++++ tests/run/inline-varargs-1/Main_2.scala | 9 +++++++++ 5 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 tests/run/inline-varargs-1.check create mode 100644 tests/run/inline-varargs-1/Macro_1.scala create mode 100644 tests/run/inline-varargs-1/Main_2.scala diff --git a/compiler/src/dotty/tools/dotc/transform/Splicer.scala b/compiler/src/dotty/tools/dotc/transform/Splicer.scala index 8fc7f2d2907b..a6bd284da409 100644 --- a/compiler/src/dotty/tools/dotc/transform/Splicer.scala +++ b/compiler/src/dotty/tools/dotc/transform/Splicer.scala @@ -102,6 +102,9 @@ object Splicer { protected def interpretLiteral(value: Any)(implicit env: Env): Object = value.asInstanceOf[Object] + protected def interpretVarargs(args: List[Object])(implicit env: Env): Object = + args.toSeq + protected def interpretTastyContext()(implicit env: Env): Object = new TastyImpl(ctx) { override def rootPosition: SourcePosition = pos @@ -240,6 +243,7 @@ object Splicer { def interpretQuote(tree: tpd.Tree)(implicit env: Env): Boolean = true def interpretTypeQuote(tree: tpd.Tree)(implicit env: Env): Boolean = true def interpretLiteral(value: Any)(implicit env: Env): Boolean = true + def interpretVarargs(args: List[Boolean])(implicit env: Env): Boolean = args.forall(identity) def interpretTastyContext()(implicit env: Env): Boolean = true def interpretStaticMethodCall(fn: tpd.Tree, args: => List[Boolean])(implicit env: Env): Boolean = args.forall(identity) @@ -259,6 +263,7 @@ object Splicer { protected def interpretQuote(tree: Tree)(implicit env: Env): Result protected def interpretTypeQuote(tree: Tree)(implicit env: Env): Result protected def interpretLiteral(value: Any)(implicit env: Env): Result + protected def interpretVarargs(args: List[Result])(implicit env: Env): Result protected def interpretTastyContext()(implicit env: Env): Result protected def interpretStaticMethodCall(fn: Tree, args: => List[Result])(implicit env: Env): Result protected def unexpectedTree(tree: Tree)(implicit env: Env): Result @@ -293,7 +298,10 @@ object Splicer { case Inlined(EmptyTree, Nil, expansion) => interpretTree(expansion) - case _ => unexpectedTree(tree) + case Typed(SeqLiteral(elems, _), _) => interpretVarargs(elems.map(e => interpretTree(e))) + + case _ => + unexpectedTree(tree) } object StaticMethodCall { diff --git a/compiler/test/dotc/run-test-pickling.blacklist b/compiler/test/dotc/run-test-pickling.blacklist index fb9a0ef0f2d2..f6a0edc4e7f5 100644 --- a/compiler/test/dotc/run-test-pickling.blacklist +++ b/compiler/test/dotc/run-test-pickling.blacklist @@ -20,6 +20,7 @@ i4803d i4803e i4803f i4947b +inline-varargs-1 implicitShortcut lazy-implicit-lists.scala lazy-implicit-nums.scala diff --git a/tests/run/inline-varargs-1.check b/tests/run/inline-varargs-1.check new file mode 100644 index 000000000000..1e8b31496214 --- /dev/null +++ b/tests/run/inline-varargs-1.check @@ -0,0 +1 @@ +6 diff --git a/tests/run/inline-varargs-1/Macro_1.scala b/tests/run/inline-varargs-1/Macro_1.scala new file mode 100644 index 000000000000..73e88f51ef25 --- /dev/null +++ b/tests/run/inline-varargs-1/Macro_1.scala @@ -0,0 +1,6 @@ + +import scala.quoted._ + +object Macros { + def sum(nums: Int*): Expr[Int] = nums.sum.toExpr +} diff --git a/tests/run/inline-varargs-1/Main_2.scala b/tests/run/inline-varargs-1/Main_2.scala new file mode 100644 index 000000000000..95edcdf19a8d --- /dev/null +++ b/tests/run/inline-varargs-1/Main_2.scala @@ -0,0 +1,9 @@ + +object Test { + + def main(args: Array[String]): Unit = { + println(sum(1, 2, 3)) + } + + inline def sum(inline i: Int, inline j: Int, inline k: Int): Int = ~Macros.sum(i, j, k) +}