[FIR] Fix infinite loop in attribute substitution

#KT-65318 Fixed
This commit is contained in:
Kirill Rakhman
2024-01-26 17:29:28 +01:00
committed by Space Team
parent d047db850f
commit 9e72482f09
8 changed files with 61 additions and 1 deletions
@@ -838,6 +838,12 @@ public class FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated extend
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt47899.kt");
}
@Test
@TestMetadata("kt65318.kt")
public void testKt65318() throws Exception {
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt65318.kt");
}
@Test
@TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception {
@@ -896,6 +896,12 @@ public class FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingT
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt47899.kt");
}
@Test
@TestMetadata("kt65318.kt")
public void testKt65318() throws Exception {
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt65318.kt");
}
@Test
@TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception {
@@ -896,6 +896,12 @@ public class FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated extends
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt47899.kt");
}
@Test
@TestMetadata("kt65318.kt")
public void testKt65318() throws Exception {
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt65318.kt");
}
@Test
@TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception {
@@ -89,7 +89,17 @@ abstract class AbstractConeSubstitutor(protected val typeContext: ConeTypeContex
}
val substitutedType = newType ?: type.substituteRecursive()
val substitutedAttributes = (substitutedType ?: type).attributes.transformTypesWith(this::substituteOrNull)
// Don't substitute attributes of flexible types because their bounds will be processed individually.
val substitutedAttributesOfUnsubstitutedType = runIf(type !is ConeFlexibleType) {
type.attributes.transformTypesWith(this::substituteOrNull)
}
val substitutedAttributes = substitutedAttributesOfUnsubstitutedType?.let {
// ConeAttribute.add is typically implemented to favor the RHS if both are not-null, so we use the substituted attributes as RHS.
// We can't do `(substitutedType ?: type).attributes.transformTypesWith(this::substituteOrNull)` because it could lead to an
// infinite loop in a situation like `{E -> Attr(E) Foo}` applied to `E`.
substitutedType?.attributes?.add(it) ?: it
}
return if (substitutedType != null || substitutedAttributes != null) {
var result = substitutedType ?: type
@@ -0,0 +1,14 @@
// FIR_IDENTICAL
// FILE: Super.java
import org.jspecify.annotations.NullMarked;
@NullMarked
public abstract class Super<E extends Super<E>> implements Comparable<E> {
public final int compareTo(E o) {
throw new RuntimeException();
}
}
// FILE: test.kt
open class E : Super<E>()
@@ -838,6 +838,12 @@ public class ForeignAnnotationsCompiledJavaTestGenerated extends AbstractForeign
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt47899.kt");
}
@Test
@TestMetadata("kt65318.kt")
public void testKt65318() throws Exception {
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt65318.kt");
}
@Test
@TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception {
@@ -896,6 +896,12 @@ public class ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated exte
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt47899.kt");
}
@Test
@TestMetadata("kt65318.kt")
public void testKt65318() throws Exception {
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt65318.kt");
}
@Test
@TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception {
@@ -896,6 +896,12 @@ public class ForeignAnnotationsSourceJavaTestGenerated extends AbstractForeignAn
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt47899.kt");
}
@Test
@TestMetadata("kt65318.kt")
public void testKt65318() throws Exception {
runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/kt65318.kt");
}
@Test
@TestMetadata("NonPlatformTypeParameter.kt")
public void testNonPlatformTypeParameter() throws Exception {