Skip to content

Commit daf1be8

Browse files
committed
Fix #4073: erase <repeted> type from lifted val for a vararg
1 parent e531634 commit daf1be8

File tree

8 files changed

+57
-6
lines changed

8 files changed

+57
-6
lines changed

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,16 +133,17 @@ 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 = if (tp.isRepeatedParam) repeatedErased(tp, isJava) else tp
142137
val erase = erasureFn(isJava, semiEraseVCs = false, isConstructor = false, wildcardOK = true)
143138
erase.sigName(normTp)(erasureCtx)
144139
}
145140

141+
/** Erases a repeated T* class into Seq[T] or Array[T] */
142+
def repeatedErased(tp: Type, isJava: Boolean)(implicit ctx: Context): Type = {
143+
val seqClass = if (isJava) defn.ArrayClass else defn.SeqClass
144+
tp.translateParameterized(defn.RepeatedParamClass, seqClass)
145+
}
146+
146147
/** The erasure of a top-level reference. Differs from normal erasure in that
147148
* TermRefs are kept instead of being widened away.
148149
*/
@@ -394,6 +395,7 @@ class TypeErasure(isJava: Boolean, semiEraseVCs: Boolean, isConstructor: Boolean
394395
else eraseNormalClassRef(tp)
395396
case tp: AppliedType =>
396397
if (tp.tycon.isRef(defn.ArrayClass)) eraseArray(tp)
398+
else if (tp.isRepeatedParam) apply(repeatedErased(tp, isJava))
397399
else apply(tp.superType)
398400
case _: TermRef | _: ThisType =>
399401
this(tp.widen)

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)