Skip to content

Commit 37c2f93

Browse files
Merge pull request #4086 from dotty-staging/fix-#4073
Fix #4073: erase <repeted> type from lifted val for a vararg
2 parents a230912 + bbb2a04 commit 37c2f93

File tree

9 files changed

+52
-7
lines changed

9 files changed

+52
-7
lines changed

compiler/src/dotty/tools/dotc/core/TypeErasure.scala

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,7 @@ object TypeErasure {
133133
erasureFn(isJava = false, semiEraseVCs = true, isConstructor = false, wildcardOK = false)(tp)(erasureCtx)
134134

135135
def sigName(tp: Type, isJava: Boolean)(implicit ctx: Context): TypeName = {
136-
val normTp =
137-
if (tp.isRepeatedParam) {
138-
val seqClass = if (isJava) defn.ArrayClass else defn.SeqClass
139-
tp.translateParameterized(defn.RepeatedParamClass, seqClass)
140-
}
141-
else tp
136+
val normTp = tp.underlyingIfRepeated(isJava)
142137
val erase = erasureFn(isJava, semiEraseVCs = false, isConstructor = false, wildcardOK = true)
143138
erase.sigName(normTp)(erasureCtx)
144139
}
@@ -394,6 +389,7 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
394389
else eraseNormalClassRef(tp)
395390
case tp: AppliedType =>
396391
if (tp.tycon.isRef(defn.ArrayClass)) eraseArray(tp)
392+
else if (tp.isRepeatedParam) apply(tp.underlyingIfRepeated(isJava))
397393
else apply(tp.superType)
398394
case _: TermRef | _: ThisType =>
399395
this(tp.widen)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class ElimRepeated extends MiniPhase with InfoTransformer { thisPhase =>
8282
arg match {
8383
case arg: Typed if isWildcardStarArg(arg) =>
8484
if (tree.fun.symbol.is(JavaDefined) && arg.expr.tpe.derivesFrom(defn.SeqClass))
85-
seqToArray(arg.expr, formal.translateParameterized(defn.RepeatedParamClass, defn.ArrayClass))
85+
seqToArray(arg.expr, formal.underlyingIfRepeated(isJava = true))
8686
else arg.expr
8787
case arg => arg
8888
}

tests/Foo.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import scala.language.dynamics
2+
3+
class DynImpl extends Dynamic {
4+
def applyDynamic(name: String)(args: Any*)(implicit implicitArg: String = "foo"): String =
5+
s"method '$name' called with arguments ${args.mkString("'", "', '", "'")} and implicit argument '$implicitArg'"
6+
}
7+
8+
object Main {
9+
def main(args:Array[String]): Unit = {
10+
val d = new DynImpl
11+
12+
println(d.some())
13+
14+
println(d.ints(1, 2, 3))
15+
16+
println(d.strings("a", "b", "c"))
17+
}
18+
}

tests/run/i4073.check

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
method 'some' called with arguments '' and implicit argument 'foo'
2+
method 'ints' called with arguments '1', '2', '3' and implicit argument 'foo'
3+
method 'strings' called with arguments 'a', 'b', 'c' and implicit argument 'foo'

tests/run/i4073.scala

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import scala.language.dynamics
2+
3+
class DynImpl extends Dynamic {
4+
def applyDynamic(name: String)(args: Any*)(implicit implicitArg: String = "foo"): String =
5+
s"method '$name' called with arguments ${args.mkString("'", "', '", "'")} and implicit argument '$implicitArg'"
6+
}
7+
8+
object Test {
9+
def main(args:Array[String]): Unit = {
10+
val d = new DynImpl
11+
12+
println(d.some())
13+
14+
println(d.ints(1, 2, 3))
15+
16+
println(d.strings("a", "b", "c"))
17+
}
18+
}

tests/run/i4073b.check

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
foo123

tests/run/i4073b.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
object Test {
2+
def main(args:Array[String]): Unit = println(foo(1, 2, 3)())
3+
def foo(args: Any*)(arg: String = "foo"): String = arg + args.mkString("")
4+
}

tests/run/i4073c.check

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
foo123

tests/run/i4073c.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
object Test {
2+
def main(args:Array[String]): Unit = println(foo(1, 2, 3)())
3+
def foo(args: Int*)(arg: String = "foo"): String = arg + args.mkString("")
4+
}

0 commit comments

Comments
 (0)