From d252918bd211c0b498e8509997e3093493a38ab9 Mon Sep 17 00:00:00 2001 From: odersky Date: Fri, 8 Apr 2022 11:16:35 +0200 Subject: [PATCH 1/2] Prevent stack overflow ICEs in array erasure Fixes #12453 --- compiler/src/dotty/tools/dotc/core/TypeErasure.scala | 5 ++++- tests/neg/i12453.scala | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 tests/neg/i12453.scala diff --git a/compiler/src/dotty/tools/dotc/core/TypeErasure.scala b/compiler/src/dotty/tools/dotc/core/TypeErasure.scala index a8ce6039db18..14e8d6d17577 100644 --- a/compiler/src/dotty/tools/dotc/core/TypeErasure.scala +++ b/compiler/src/dotty/tools/dotc/core/TypeErasure.scala @@ -682,7 +682,10 @@ class TypeErasure(sourceLanguage: SourceLanguage, semiEraseVCs: Boolean, isConst private def eraseArray(tp: Type)(using Context) = { val defn.ArrayOf(elemtp) = tp if (isGenericArrayElement(elemtp, isScala2 = sourceLanguage.isScala2)) defn.ObjectType - else JavaArrayType(erasureFn(sourceLanguage, semiEraseVCs = false, isConstructor, isSymbol, wildcardOK)(elemtp)) + else + try JavaArrayType(erasureFn(sourceLanguage, semiEraseVCs = false, isConstructor, isSymbol, wildcardOK)(elemtp)) + catch case ex: Throwable => + handleRecursive("erase array type", tp.show, ex) } private def erasePair(tp: Type)(using Context): Type = { diff --git a/tests/neg/i12453.scala b/tests/neg/i12453.scala new file mode 100644 index 000000000000..ae7ccbbbb9eb --- /dev/null +++ b/tests/neg/i12453.scala @@ -0,0 +1 @@ +trait I0 { def I1 [ I1 <: Array [ I1 ] ] : I1 } // error From 07d6f2710f2d173068f3980d81c0eb629c9fa1d6 Mon Sep 17 00:00:00 2001 From: odersky Date: Fri, 8 Apr 2022 18:44:20 +0200 Subject: [PATCH 2/2] Drop test --- tests/neg/i12453.scala | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tests/neg/i12453.scala diff --git a/tests/neg/i12453.scala b/tests/neg/i12453.scala deleted file mode 100644 index ae7ccbbbb9eb..000000000000 --- a/tests/neg/i12453.scala +++ /dev/null @@ -1 +0,0 @@ -trait I0 { def I1 [ I1 <: Array [ I1 ] ] : I1 } // error