Skip to content

Commit 59ea93e

Browse files
hamzaremmaltgodzik
authored andcommitted
fix: align Scala 2's erasure of Array[? <: Null] and Array[? <: Nothing] with Scala 2
[Cherry-picked f77b1f9]
1 parent bf2884d commit 59ea93e

File tree

2 files changed

+11
-11
lines changed

2 files changed

+11
-11
lines changed

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

+9-9
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ object TypeErasure {
327327
val sym = t.symbol
328328
// Only a few classes have both primitives and references as subclasses.
329329
if (sym eq defn.AnyClass) || (sym eq defn.AnyValClass) || (sym eq defn.MatchableClass) || (sym eq defn.SingletonClass)
330-
|| isScala2 && !(t.derivesFrom(defn.ObjectClass) || t.isNullType) then
330+
|| isScala2 && !(t.derivesFrom(defn.ObjectClass) || t.isNullType | t.isNothingType) then
331331
NoSymbol
332332
// We only need to check for primitives because derived value classes in arrays are always boxed.
333333
else if sym.isPrimitiveValueClass then
@@ -779,14 +779,14 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
779779

780780
private def eraseArray(tp: Type)(using Context) = {
781781
val defn.ArrayOf(elemtp) = tp: @unchecked
782-
if (isGenericArrayElement(elemtp, isScala2 = sourceLanguage.isScala2)) defn.ObjectType
783-
else
784-
try
785-
if sourceLanguage.isScala2 && (elemtp.isNullType || elemtp.isNothingType) then
786-
JavaArrayType(defn.ObjectType)
787-
else erasureFn(sourceLanguage, semiEraseVCs = false, isConstructor, isSymbol, inSigName)(elemtp) match
788-
case _: WildcardType => WildcardType
789-
case elem => JavaArrayType(elem)
782+
if isGenericArrayElement(elemtp, isScala2 = sourceLanguage.isScala2) then
783+
defn.ObjectType
784+
else if sourceLanguage.isScala2 && (elemtp.hiBound.isNullType || elemtp.hiBound.isNothingType) then
785+
JavaArrayType(defn.ObjectType)
786+
else
787+
try erasureFn(sourceLanguage, semiEraseVCs = false, isConstructor, isSymbol, inSigName)(elemtp) match
788+
case _: WildcardType => WildcardType
789+
case elem => JavaArrayType(elem)
790790
catch case ex: Throwable =>
791791
handleRecursive("erase array type", tp.show, ex)
792792
}

sbt-test/scala2-compat/erasure/dottyApp/Main.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ object Main {
103103
z.objectARRAY_90(dummy)
104104
z.objectARRAY_91(dummy)
105105
z.objectARRAY_92(dummy)
106-
//z.objectARRAY_93(dummy)
107-
//z.objectARRAY_94(dummy)
106+
z.objectARRAY_93(dummy)
107+
z.objectARRAY_94(dummy)
108108

109109
val methods = classOf[scala2Lib.Z].getDeclaredMethods.toList ++ classOf[dottyApp.Z].getDeclaredMethods.toList
110110
methods.foreach { m =>

0 commit comments

Comments
 (0)