diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index 857d8acdf99..a0e90e7dfe1 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -10986,6 +10986,11 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirOldFronte runTest("compiler/testData/diagnostics/tests/inference/nothingType/inferArgumentToNothingFromNullConstant.kt"); } + @TestMetadata("inferenceWithRecursiveGenericsAndNothing.kt") + public void testInferenceWithRecursiveGenericsAndNothing() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/nothingType/inferenceWithRecursiveGenericsAndNothing.kt"); + } + @TestMetadata("kt24490.kt") public void testKt24490() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/nothingType/kt24490.kt"); diff --git a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java index 873cae3d933..f998ff0bc16 100644 --- a/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java +++ b/compiler/fir/analysis-tests/tests/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestWithStdlibGenerated.java @@ -2384,6 +2384,11 @@ public class FirOldFrontendDiagnosticsTestWithStdlibGenerated extends AbstractFi runTest("compiler/testData/diagnostics/testsWithStdLib/regression/kt34391.kt"); } + @TestMetadata("kt37554.kt") + public void testKt37554() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/regression/kt37554.kt"); + } + @TestMetadata("kt9820_javaFunctionTypeInheritor.kt") public void testKt9820_javaFunctionTypeInheritor() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/regression/kt9820_javaFunctionTypeInheritor.kt"); diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt index 9949c4162a8..606fe30c04e 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/inference/components/VariableFixationFinder.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.calls.inference.components import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode import org.jetbrains.kotlin.resolve.calls.inference.components.KotlinConstraintSystemCompleter.ConstraintSystemCompletionMode.PARTIAL import org.jetbrains.kotlin.resolve.calls.inference.model.Constraint +import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintKind import org.jetbrains.kotlin.resolve.calls.inference.model.DeclaredUpperBoundConstraintPosition import org.jetbrains.kotlin.resolve.calls.inference.model.VariableWithConstraints import org.jetbrains.kotlin.resolve.calls.model.PostponedResolvedAtomMarker @@ -53,7 +54,8 @@ class VariableFixationFinder( enum class TypeVariableFixationReadiness { FORBIDDEN, WITHOUT_PROPER_ARGUMENT_CONSTRAINT, // proper constraint from arguments -- not from upper bound for type parameters - WITH_COMPLEX_DEPENDENCY, // if type variable T has constraint with non fixed type variable inside (non-top-level): T <: Foo + WITH_COMPLEX_DEPENDENCY_LOWER, // if type variable T has constraint with non fixed type variable inside (non-top-level): T <: Foo + WITH_COMPLEX_DEPENDENCY_UPPER, // Foo <: T WITH_TRIVIAL_OR_NON_PROPER_CONSTRAINTS, // proper trivial constraint from arguments, Nothing <: T RELATED_TO_ANY_OUTPUT_TYPE, READY_FOR_FIXATION, @@ -67,7 +69,8 @@ class VariableFixationFinder( !notFixedTypeVariables.contains(variable) || dependencyProvider.isVariableRelatedToTopLevelType(variable) -> TypeVariableFixationReadiness.FORBIDDEN !variableHasProperArgumentConstraints(variable) -> TypeVariableFixationReadiness.WITHOUT_PROPER_ARGUMENT_CONSTRAINT - hasDependencyToOtherTypeVariables(variable) -> TypeVariableFixationReadiness.WITH_COMPLEX_DEPENDENCY + hasDependencyToOtherTypeVariables(variable, ConstraintKind.LOWER) -> TypeVariableFixationReadiness.WITH_COMPLEX_DEPENDENCY_LOWER + hasDependencyToOtherTypeVariables(variable, ConstraintKind.UPPER) -> TypeVariableFixationReadiness.WITH_COMPLEX_DEPENDENCY_UPPER variableHasTrivialOrNonProperConstraints(variable) -> TypeVariableFixationReadiness.WITH_TRIVIAL_OR_NON_PROPER_CONSTRAINTS dependencyProvider.isVariableRelatedToAnyOutputType(variable) -> TypeVariableFixationReadiness.RELATED_TO_ANY_OUTPUT_TYPE isReified(variable) -> TypeVariableFixationReadiness.READY_FOR_FIXATION_REIFIED @@ -118,8 +121,9 @@ class VariableFixationFinder( } } - private fun Context.hasDependencyToOtherTypeVariables(typeVariable: TypeConstructorMarker): Boolean { + private fun Context.hasDependencyToOtherTypeVariables(typeVariable: TypeConstructorMarker, kind: ConstraintKind): Boolean { for (constraint in notFixedTypeVariables[typeVariable]?.constraints ?: return false) { + if (constraint.kind != kind || constraint.kind == ConstraintKind.EQUALITY) continue if (constraint.type.lowerBoundIfFlexible().argumentsCount() != 0 && constraint.type.contains { notFixedTypeVariables.containsKey(it.typeConstructor()) }) { return true } diff --git a/compiler/testData/diagnostics/tests/inference/nothingType/inferenceWithRecursiveGenericsAndNothing.kt b/compiler/testData/diagnostics/tests/inference/nothingType/inferenceWithRecursiveGenericsAndNothing.kt new file mode 100644 index 00000000000..d1ddfb3a4a2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/nothingType/inferenceWithRecursiveGenericsAndNothing.kt @@ -0,0 +1,16 @@ +// FIR_IDENTICAL +// !DIAGNOSTICS: -UNUSED_PARAMETER + +interface Out +interface In +interface Recursive> + +interface Specialized : In + +class Parent : Specialized + +fun > foo(o: Out): Recursive? = null + +fun test(o: Out) { + foo(o) ?: return +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/nothingType/inferenceWithRecursiveGenericsAndNothing.txt b/compiler/testData/diagnostics/tests/inference/nothingType/inferenceWithRecursiveGenericsAndNothing.txt new file mode 100644 index 00000000000..c82100afddb --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/nothingType/inferenceWithRecursiveGenericsAndNothing.txt @@ -0,0 +1,35 @@ +package + +public fun > foo(/*0*/ o: Out): Recursive? +public fun test(/*0*/ o: Out): kotlin.Unit + +public interface In { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Out { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class Parent : Specialized { + public constructor Parent() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Recursive> { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Specialized : In { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/regression/kt37554.kt b/compiler/testData/diagnostics/testsWithStdLib/regression/kt37554.kt new file mode 100644 index 00000000000..cac79736e62 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/regression/kt37554.kt @@ -0,0 +1,20 @@ +// FIR_IDENTICAL +// FULL_JDK + +import java.time.LocalDate + +data class DailyTime(val date: LocalDate) + +fun > Sequence.range(): ClosedRange? { + val iter = iterator() + return when { + iter.hasNext() -> iter.next().let { it..it } + else -> null + } +} + +fun test(dailyTimes: List): List { + val dateRange = dailyTimes.asSequence().map { it.date }.range() ?: return emptyList() + println(dateRange.start) + return dailyTimes +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/regression/kt37554.txt b/compiler/testData/diagnostics/testsWithStdLib/regression/kt37554.txt new file mode 100644 index 00000000000..694236e18ac --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/regression/kt37554.txt @@ -0,0 +1,14 @@ +package + +public fun test(/*0*/ dailyTimes: kotlin.collections.List): kotlin.collections.List +public fun > kotlin.sequences.Sequence.range(): kotlin.ranges.ClosedRange? + +public final data class DailyTime { + public constructor DailyTime(/*0*/ date: java.time.LocalDate) + public final val date: java.time.LocalDate + public final operator /*synthesized*/ fun component1(): java.time.LocalDate + public final /*synthesized*/ fun copy(/*0*/ date: java.time.LocalDate = ...): DailyTime + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 41067439744..edf5af8bfcd 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -10993,6 +10993,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTestWithFirVali runTest("compiler/testData/diagnostics/tests/inference/nothingType/inferArgumentToNothingFromNullConstant.kt"); } + @TestMetadata("inferenceWithRecursiveGenericsAndNothing.kt") + public void testInferenceWithRecursiveGenericsAndNothing() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/nothingType/inferenceWithRecursiveGenericsAndNothing.kt"); + } + @TestMetadata("kt24490.kt") public void testKt24490() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/nothingType/kt24490.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java index 10ffbe731cd..bbf169ece4c 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestWithStdLibGenerated.java @@ -3364,6 +3364,11 @@ public class DiagnosticsTestWithStdLibGenerated extends AbstractDiagnosticsTestW runTest("compiler/testData/diagnostics/testsWithStdLib/regression/kt34391.kt"); } + @TestMetadata("kt37554.kt") + public void testKt37554() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/regression/kt37554.kt"); + } + @TestMetadata("kt9820_javaFunctionTypeInheritor.kt") public void testKt9820_javaFunctionTypeInheritor() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/regression/kt9820_javaFunctionTypeInheritor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java index eda919f8a67..cb3e8020d51 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsTestWithStdLibUsingJavacGenerated.java @@ -3364,6 +3364,11 @@ public class DiagnosticsTestWithStdLibUsingJavacGenerated extends AbstractDiagno runTest("compiler/testData/diagnostics/testsWithStdLib/regression/kt34391.kt"); } + @TestMetadata("kt37554.kt") + public void testKt37554() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/regression/kt37554.kt"); + } + @TestMetadata("kt9820_javaFunctionTypeInheritor.kt") public void testKt9820_javaFunctionTypeInheritor() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/regression/kt9820_javaFunctionTypeInheritor.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 209d7a8e77f..16d37d269ab 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -10988,6 +10988,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/inference/nothingType/inferArgumentToNothingFromNullConstant.kt"); } + @TestMetadata("inferenceWithRecursiveGenericsAndNothing.kt") + public void testInferenceWithRecursiveGenericsAndNothing() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/nothingType/inferenceWithRecursiveGenericsAndNothing.kt"); + } + @TestMetadata("kt24490.kt") public void testKt24490() throws Exception { runTest("compiler/testData/diagnostics/tests/inference/nothingType/kt24490.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/JvmDecompiledTextTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/JvmDecompiledTextTestGenerated.java index c9d7bb7b635..0f49a4b6400 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/JvmDecompiledTextTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/textBuilder/JvmDecompiledTextTestGenerated.java @@ -53,6 +53,19 @@ public class JvmDecompiledTextTestGenerated extends AbstractJvmDecompiledTextTes runTest("idea/testData/decompiler/decompiledTextJvm/TypeAliases/"); } + @TestMetadata("idea/testData/decompiler/decompiledTextJvm/EnumWithQuotes") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class EnumWithQuotes extends AbstractJvmDecompiledTextTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInEnumWithQuotes() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/decompiler/decompiledTextJvm/EnumWithQuotes"), Pattern.compile("^([^\\.]+)$"), null, true); + } + } + @TestMetadata("idea/testData/decompiler/decompiledTextJvm/Modifiers") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)