Skip to content

Commit 511ab69

Browse files
committed
Fix repeated args when type is union
1 parent 8c56525 commit 511ab69

File tree

4 files changed

+29
-5
lines changed

4 files changed

+29
-5
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,10 @@ class ElimRepeated extends MiniPhase with InfoTransformer { thisPhase =>
171171
* of generic Java varargs in `elimRepeated`.
172172
*/
173173
private def adaptToArray(tree: Tree, elemPt: Type)(implicit ctx: Context): Tree =
174-
val elemTp = tree.tpe.elemType
174+
val treeTpe = tree.tpe.widenUnion
175+
val elemTp = treeTpe.elemType
175176
val elemTpMatches = elemTp <:< elemPt
176-
val treeIsArray = tree.tpe.derivesFrom(defn.ArrayClass)
177+
val treeIsArray = treeTpe.derivesFrom(defn.ArrayClass)
177178
if elemTpMatches && treeIsArray then
178179
tree // No adaptation necessary
179180
else tree match

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -753,10 +753,10 @@ class Typer extends Namer
753753
if (ctx.mode.is(Mode.QuotedPattern)) pt.translateFromRepeated(toArray = false, translateWildcard = true)
754754
else pt.translateFromRepeated(toArray = false, translateWildcard = true) |
755755
pt.translateFromRepeated(toArray = true, translateWildcard = true)
756-
val tpdExpr = typedExpr(tree.expr, ptArg)
757756
val expr1 = typedExpr(tree.expr, ptArg)
758-
val fromCls = if expr1.tpe.derivesFrom(defn.ArrayClass) then defn.ArrayClass else defn.SeqClass
759-
val tpt1 = TypeTree(expr1.tpe.widen.translateToRepeated(fromCls)).withSpan(tree.tpt.span)
757+
val exprTpeWiden = expr1.tpe.widenUnion
758+
val fromCls = if exprTpeWiden.derivesFrom(defn.ArrayClass) then defn.ArrayClass else defn.SeqClass
759+
val tpt1 = TypeTree(exprTpeWiden.translateToRepeated(fromCls)).withSpan(tree.tpt.span)
760760
assignType(cpy.Typed(tree)(expr1, tpt1), tpt1)
761761
}
762762
cases(

tests/neg/repeatedArgs213.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,16 @@ class repeatedArgs {
1515
Paths.get("Hello", ys: _*) // error: immutable.Seq expected, found Seq
1616
Paths.get("Hello", zs: _*)
1717
}
18+
19+
def test2(xs: immutable.Seq[String] | Null, ys: collection.Seq[String] | Null, zs: Array[String] | Null): Unit = {
20+
bar("a", "b", "c")
21+
bar(xs: _*)
22+
bar(ys: _*) // error: immutable.Seq expected, found Seq
23+
bar(zs: _*) // old-error: Remove (compiler generated) Array to Seq conversion in 2.13?
24+
25+
Paths.get("Hello", "World")
26+
Paths.get("Hello", xs: _*)
27+
Paths.get("Hello", ys: _*) // error: immutable.Seq expected, found Seq
28+
Paths.get("Hello", zs: _*)
29+
}
1830
}

tests/pos/repeatedArgs213.scala

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,15 @@ class repeatedArgs {
1515
val List(_, others: _*) = xs.toList // toList should not be needed, see #4790
1616
val x: immutable.Seq[String] = others
1717
}
18+
19+
def test2(xs: immutable.Seq[String] | Null): Unit = {
20+
bar("a", "b", "c")
21+
bar(xs: _*)
22+
23+
Paths.get("Hello", "World")
24+
Paths.get("Hello", xs: _*)
25+
26+
val List(_, others: _*) = xs.toList // toList should not be needed, see #4790
27+
val x: immutable.Seq[String] = others
28+
}
1829
}

0 commit comments

Comments
 (0)