@@ -415,7 +415,48 @@ class ClassfileParser(
415
415
if (argsBuf != null ) argsBuf += arg
416
416
}
417
417
accept('>' )
418
- if (skiptvs) tp else AppliedType (tp, argsBuf.toList)
418
+ if (skiptvs) tp else
419
+ // Fix the type arguments for specialised tuples.
420
+ // For example, `Tuple2$mcIC$sp` actually extends `Tuple<Object, Object>`
421
+ // instead of `Tuple<Integer, Character>`. That could be simply an
422
+ // accident or it could be to avoid having to also generate the bridge
423
+ // methods for the accessors. Seeing as the whole point of the classes
424
+ // is to avoid boxing, I kind of like it, as it forces the use of the
425
+ // specialised accessor methods (eg `_1$mcI$sp()` which returns int).
426
+ // But it's a problem when running -Ycheck after TupleSpecialisation
427
+ // as the tree `new Tuple2$mcIC$sp(1, 'a')` doesn't typecheck against
428
+ // the expected `(Int, Char)` type.
429
+ val args = (if owner == null then " " else owner.name.toString) match
430
+ case " Tuple1$mcD$sp" => List (defn.DoubleType )
431
+ case " Tuple1$mcI$sp" => List (defn.IntType )
432
+ case " Tuple1$mcJ$sp" => List (defn.LongType )
433
+ case " Tuple2$mcCC$sp" => List (defn.CharType , defn.CharType )
434
+ case " Tuple2$mcCD$sp" => List (defn.CharType , defn.DoubleType )
435
+ case " Tuple2$mcCI$sp" => List (defn.CharType , defn.IntType )
436
+ case " Tuple2$mcCJ$sp" => List (defn.CharType , defn.LongType )
437
+ case " Tuple2$mcCZ$sp" => List (defn.CharType , defn.BooleanType )
438
+ case " Tuple2$mcDC$sp" => List (defn.DoubleType , defn.CharType )
439
+ case " Tuple2$mcDD$sp" => List (defn.DoubleType , defn.DoubleType )
440
+ case " Tuple2$mcDI$sp" => List (defn.DoubleType , defn.IntType )
441
+ case " Tuple2$mcDJ$sp" => List (defn.DoubleType , defn.LongType )
442
+ case " Tuple2$mcDZ$sp" => List (defn.DoubleType , defn.BooleanType )
443
+ case " Tuple2$mcIC$sp" => List (defn.IntType , defn.CharType )
444
+ case " Tuple2$mcID$sp" => List (defn.IntType , defn.DoubleType )
445
+ case " Tuple2$mcII$sp" => List (defn.IntType , defn.IntType )
446
+ case " Tuple2$mcIJ$sp" => List (defn.IntType , defn.LongType )
447
+ case " Tuple2$mcIZ$sp" => List (defn.IntType , defn.BooleanType )
448
+ case " Tuple2$mcJC$sp" => List (defn.LongType , defn.CharType )
449
+ case " Tuple2$mcJD$sp" => List (defn.LongType , defn.DoubleType )
450
+ case " Tuple2$mcJI$sp" => List (defn.LongType , defn.IntType )
451
+ case " Tuple2$mcJJ$sp" => List (defn.LongType , defn.LongType )
452
+ case " Tuple2$mcJZ$sp" => List (defn.LongType , defn.BooleanType )
453
+ case " Tuple2$mcZC$sp" => List (defn.BooleanType , defn.CharType )
454
+ case " Tuple2$mcZD$sp" => List (defn.BooleanType , defn.DoubleType )
455
+ case " Tuple2$mcZI$sp" => List (defn.BooleanType , defn.IntType )
456
+ case " Tuple2$mcZJ$sp" => List (defn.BooleanType , defn.LongType )
457
+ case " Tuple2$mcZZ$sp" => List (defn.BooleanType , defn.BooleanType )
458
+ case _ => argsBuf.toList
459
+ AppliedType (tp, args)
419
460
}
420
461
else tp
421
462
case tp =>
0 commit comments