Skip to content

Commit d252918

Browse files
committed
Prevent stack overflow ICEs in array erasure
Fixes #12453
1 parent 8d3083b commit d252918

File tree

2 files changed

+5
-1
lines changed

2 files changed

+5
-1
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,7 +682,10 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst
682682
private def eraseArray(tp: Type)(using Context) = {
683683
val defn.ArrayOf(elemtp) = tp
684684
if (isGenericArrayElement(elemtp, isScala2 = sourceLanguage.isScala2)) defn.ObjectType
685-
else JavaArrayType(erasureFn(sourceLanguage, semiEraseVCs = false, isConstructor, isSymbol, wildcardOK)(elemtp))
685+
else
686+
try JavaArrayType(erasureFn(sourceLanguage, semiEraseVCs = false, isConstructor, isSymbol, wildcardOK)(elemtp))
687+
catch case ex: Throwable =>
688+
handleRecursive("erase array type", tp.show, ex)
686689
}
687690

688691
private def erasePair(tp: Type)(using Context): Type = {

tests/neg/i12453.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
trait I0 { def I1 [ I1 <: Array [ I1 ] ] : I1 } // error

0 commit comments

Comments
 (0)