Skip to content

Commit 55cef3d

Browse files
Fix "types differ" error by moving bridge generation to the next phase
1 parent 0150c2a commit 55cef3d

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

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

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -183,18 +183,7 @@ class ElimRepeated extends MiniPhase with InfoTransformer { thisPhase =>
183183
// non-overrides cannot be synthetic otherwise javac refuses to call them
184184
flags = if javaOverride then flags | Artifact else flags,
185185
info = toJavaVarArgs(ddef.symbol.info)
186-
).enteredAfter(thisPhase).asTerm
187-
188-
val bridgeDef = polyDefDef(bridge, trefs => vrefss => {
189-
val init :+ (last :+ vararg) = vrefss
190-
// Can't call `.argTypes` here because the underlying array type is of the
191-
// form `Array[? <: SomeType]`, so we need `.argInfos` to get the `TypeBounds`.
192-
val elemtp = vararg.tpe.widen.argInfos.head
193-
ref(original.termRef)
194-
.appliedToTypes(trefs)
195-
.appliedToArgss(init)
196-
.appliedToArgs(last :+ tpd.wrapArray(vararg, elemtp))
197-
})
186+
).asTerm
198187

199188
val bridgeDenot = bridge.denot
200189
currentClass.info.member(bridge.name).alternatives.find { s =>
@@ -205,7 +194,19 @@ class ElimRepeated extends MiniPhase with InfoTransformer { thisPhase =>
205194
ctx.error(s"@varargs produces a forwarder method that conflicts with ${conflict.showDcl}", ddef.sourcePos)
206195
EmptyTree
207196
case None =>
208-
Thicket(ddef, bridgeDef)
197+
ctx.atNextPhase {
198+
val bridgeDef = polyDefDef(bridge, trefs => vrefss => {
199+
val init :+ (last :+ vararg) = vrefss
200+
// Can't call `.argTypes` here because the underlying array type is of the
201+
// form `Array[? <: SomeType]`, so we need `.argInfos` to get the `TypeBounds`.
202+
val elemtp = vararg.tpe.widen.argInfos.head
203+
ref(original.termRef)
204+
.appliedToTypes(trefs)
205+
.appliedToArgss(init)
206+
.appliedToArgs(last :+ tpd.wrapArray(vararg, elemtp))
207+
})
208+
Thicket(ddef, bridgeDef)
209+
}
209210

210211
/** Convert type from Scala to Java varargs method */
211212
private def toJavaVarArgs(tp: Type)(using Context): Type = tp match

tests/neg/varargs-annot.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ object Test {
77
def v1(a: Int, b: Array[String]) = a
88
}
99

10-
trait B extends A { // error (could we get rid of that one?)
10+
trait B extends A {
1111
@varargs def v1(a: Int, b: String*) = a + b.length // error
1212
}
1313

0 commit comments

Comments
 (0)