@@ -191,17 +191,18 @@ object desugar {
191
191
192
192
/** Fill in empty type bounds with Nothing/Any. Expand private local type parameters as follows:
193
193
*
194
- * class C[T]
194
+ * class C[v T]
195
195
* ==>
196
- * class C { type C$T; type T = C$T }
196
+ * class C { type v C$T; type v T = C$T }
197
197
*/
198
198
def typeDef (tdef : TypeDef )(implicit ctx : Context ): Tree = {
199
199
val TypeDef (mods, name, rhs) = tdef
200
200
if (mods is PrivateLocalParam ) {
201
201
val tparam = cpy.TypeDef (tdef,
202
202
mods &~ PrivateLocal | ExpandedName , name.expandedName(ctx.owner), rhs, tdef.tparams)
203
203
val alias = cpy.TypeDef (tdef,
204
- Modifiers (PrivateLocalParamAccessor | Synthetic ), name, refOfDef(tparam))
204
+ Modifiers (PrivateLocalParamAccessor | Synthetic | mods.flags & VarianceFlags ),
205
+ name, refOfDef(tparam))
205
206
Thicket (tparam, alias)
206
207
}
207
208
else cpy.TypeDef (tdef, mods, name, rhs, tdef.tparams)
@@ -274,7 +275,13 @@ object desugar {
274
275
// def _1 = this.p1
275
276
// ...
276
277
// def _N = this.pN
277
- // def copy(p1: T1 = p1, ..., pN: TN = pN)(moreParams) = new C[...](p1, ..., pN)(moreParams)
278
+ // def copy(p1: T1 = p1: @uncheckedVariance, ...,
279
+ // pN: TN = pN: @uncheckedVariance)(moreParams) =
280
+ // new C[...](p1, ..., pN)(moreParams)
281
+ //
282
+ // Note: copy default parameters need @uncheckedVariance; see
283
+ // neg/t1843-variances.scala for a test case. The test would give
284
+ // two errors without @uncheckedVariance, one of them spurious.
278
285
val caseClassMeths =
279
286
if (mods is Case ) {
280
287
def syntheticProperty (name : TermName , rhs : Tree ) =
@@ -289,8 +296,10 @@ object desugar {
289
296
val copyMeths =
290
297
if (mods is Abstract ) Nil
291
298
else {
299
+ def copyDefault (vparam : ValDef ) =
300
+ makeAnnotated(defn.UncheckedVarianceAnnot , refOfDef(vparam))
292
301
val copyFirstParams = derivedVparamss.head.map(vparam =>
293
- cpy.ValDef (vparam, vparam.mods, vparam.name, vparam.tpt, refOfDef (vparam)))
302
+ cpy.ValDef (vparam, vparam.mods, vparam.name, vparam.tpt, copyDefault (vparam)))
294
303
val copyRestParamss = derivedVparamss.tail.nestedMap(vparam =>
295
304
cpy.ValDef (vparam, vparam.mods, vparam.name, vparam.tpt, EmptyTree ))
296
305
DefDef (synthetic, nme.copy, derivedTparams, copyFirstParams :: copyRestParamss, TypeTree (), creatorExpr) :: Nil
0 commit comments