Skip to content

Commit 73cc569

Browse files
committed
Special-case tuple specialised superclass type args
1 parent 6b8e5e4 commit 73cc569

File tree

1 file changed

+42
-1
lines changed

1 file changed

+42
-1
lines changed

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,48 @@ class ClassfileParser(
415415
if (argsBuf != null) argsBuf += arg
416416
}
417417
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)
419460
}
420461
else tp
421462
case tp =>

0 commit comments

Comments
 (0)