From c9ad2b3bf991b985297ce56fe57328b1d70bc291 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Wed, 27 Oct 2021 18:20:28 +0300 Subject: [PATCH] [FIR] Ignore visited super types during bypass in FirInconsistentTypeParameterHelpers Get rid of potential exponential complexity --- .../checkers/FirInconsistentTypeParameterHelpers.kt | 8 ++++++-- .../tests/generics/InconsistentTypeParameterBounds.fir.kt | 7 +++++++ .../tests/generics/InconsistentTypeParameterBounds.kt | 1 - 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/generics/InconsistentTypeParameterBounds.fir.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirInconsistentTypeParameterHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirInconsistentTypeParameterHelpers.kt index d04b8985dda..8a6437e9343 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirInconsistentTypeParameterHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirInconsistentTypeParameterHelpers.kt @@ -58,6 +58,7 @@ private fun buildDeepSubstitutionMultimap( ): Map { val result = mutableMapOf() val substitution = mutableMapOf() + val visitedSupertypes = mutableSetOf() val session = context.session val typeContext = session.typeContext @@ -94,9 +95,12 @@ private fun buildDeepSubstitutionMultimap( } for (superTypeRef in classSymbol.resolvedSuperTypeRefs) { + val fullyExpandedType = superTypeRef.coneType.fullyExpandedType(session) + if (!visitedSupertypes.add(fullyExpandedType)) + return + + val superClassSymbol = fullyExpandedType.toRegularClassSymbol(session) withSuppressedDiagnostics(superTypeRef, context) { - val fullyExpandedType = superTypeRef.coneType.fullyExpandedType(session) - val superClassSymbol = fullyExpandedType.toRegularClassSymbol(session) if (!fullyExpandedType.isEnum && superClassSymbol != null) { fillInDeepSubstitutor(fullyExpandedType.typeArguments, superClassSymbol) } diff --git a/compiler/testData/diagnostics/tests/generics/InconsistentTypeParameterBounds.fir.kt b/compiler/testData/diagnostics/tests/generics/InconsistentTypeParameterBounds.fir.kt new file mode 100644 index 00000000000..df51cf022ee --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/InconsistentTypeParameterBounds.fir.kt @@ -0,0 +1,7 @@ +interface A +interface B : A + +interface ListA : List +interface ListB : List + +interface Z<T> where T : ListA, T : ListB diff --git a/compiler/testData/diagnostics/tests/generics/InconsistentTypeParameterBounds.kt b/compiler/testData/diagnostics/tests/generics/InconsistentTypeParameterBounds.kt index 74e687e8307..71dc57aa668 100644 --- a/compiler/testData/diagnostics/tests/generics/InconsistentTypeParameterBounds.kt +++ b/compiler/testData/diagnostics/tests/generics/InconsistentTypeParameterBounds.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL interface A interface B : A