Skip to content

Commit 73036c5

Browse files
committed
Convert lifted non-SeqLiteral vararg splices into Seqs
closes lampepfl#18233
1 parent 046ba60 commit 73036c5

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

compiler/src/dotty/tools/dotc/transform/ElimRepeated.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,22 @@ class ElimRepeated extends MiniPhase with InfoTransformer { thisPhase =>
167167
private def arrayToSeq(tree: Tree)(using Context): Tree =
168168
wrapArray(tree, tree.tpe.elemType)
169169

170+
/**
171+
* Wrap vararg splices that have been lifted to valdefs in a call to `arrayToSeq`.
172+
* `SeqLiteral`s are not wrapped, since they are eliminated in their own phase see `SeqLiterals`.
173+
*/
174+
override def transformValDef(tree: ValDef)(using Context): Tree =
175+
if tree.tpt.typeOpt.isRepeatedParam then
176+
tree.rhs match {
177+
case Typed(expr, tpt)
178+
if tpt.typeOpt.isRepeatedParam && expr.typeOpt.derivesFrom(defn.ArrayClass) && !expr.isInstanceOf[SeqLiteral] =>
179+
cpy.ValDef(tree)(rhs = Typed(arrayToSeq(expr), tpt))
180+
case _ =>
181+
tree
182+
}
183+
else
184+
tree
185+
170186
/** Generate the method definitions for the varargs forwarders created in transform */
171187
override def transformDefDef(tree: DefDef)(using Context): Tree =
172188
// If transform reported an error, don't go further

tests/run/i18233-min.scala

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// scalac: -coverage-out:coverage
2+
3+
def aList =
4+
List(Array[String]()*)
5+
6+
def arr =
7+
Array("abc", "def")
8+
9+
def anotherList =
10+
List(arr*)
11+
12+
object Test extends App {
13+
println(aList)
14+
println(anotherList)
15+
}

tests/run/i18233.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// scalac: -coverage-out:coverage
2+
3+
enum Foo:
4+
case Bar, Baz
5+
6+
object Foo:
7+
def render = List(values.tail*).mkString
8+
9+
object Test extends App {
10+
println(Foo.render)
11+
}

0 commit comments

Comments
 (0)