diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 3726c3bcbb5..0f94ffbc52d 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -13944,6 +13944,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt47744.kt"); } + @Test + @TestMetadata("kt49829.kt") + public void testKt49829() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt49829.kt"); + } + @Test @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index a1c5b1e2b00..4862a86ee4a 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -13944,6 +13944,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt47744.kt"); } + @Test + @TestMetadata("kt49829.kt") + public void testKt49829() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt49829.kt"); + } + @Test @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index a6568ba5cef..082e0ae9865 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -13944,6 +13944,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt47744.kt"); } + @Test + @TestMetadata("kt49829.kt") + public void testKt49829() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt49829.kt"); + } + @Test @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index 8749acb6459..df7cb15725d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -76,6 +76,7 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker; import org.jetbrains.kotlin.types.expressions.ControlStructureTypingUtils.ResolveConstruct; import org.jetbrains.kotlin.types.expressions.typeInfoFactory.TypeInfoFactoryKt; import org.jetbrains.kotlin.types.expressions.unqualifiedSuper.UnqualifiedSuperKt; +import org.jetbrains.kotlin.types.typeUtil.TypeUtilsKt; import org.jetbrains.kotlin.util.OperatorNameConventions; import java.util.Collection; @@ -372,7 +373,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return; } - if (!CastDiagnosticsUtil.isCastPossible(actualType, targetType, components.platformToKotlinClassMapper)) { + if (!CastDiagnosticsUtil.isCastPossible(actualType, targetType, components.platformToKotlinClassMapper) && !TypeUtilsKt.isStubType(actualType)) { context.trace.report(CAST_NEVER_SUCCEEDS.on(expression.getOperationReference())); return; } diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt49829.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt49829.fir.kt new file mode 100644 index 00000000000..0dcf5e0e002 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt49829.fir.kt @@ -0,0 +1,12 @@ +// WITH_STDLIB +// For FIR: see KT-50293 + +fun main() { + val list = buildList { + add("one") + add("two") + + val secondParameter = get(1) + println(secondParameter as String) // WARNING: [CAST_NEVER_SUCCEEDS] This cast can never succeed + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt49829.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt49829.kt new file mode 100644 index 00000000000..ec5031c3df4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt49829.kt @@ -0,0 +1,12 @@ +// WITH_STDLIB +// For FIR: see KT-50293 + +fun main() { + val list = buildList { + add("one") + add("two") + + val secondParameter = get(1) + println(secondParameter as String) // WARNING: [CAST_NEVER_SUCCEEDS] This cast can never succeed + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt49829.txt b/compiler/testData/diagnostics/tests/inference/builderInference/kt49829.txt new file mode 100644 index 00000000000..a9fef69810f --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt49829.txt @@ -0,0 +1,3 @@ +package + +public fun main(): kotlin.Unit diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 49d83dec5fb..5c4802b7e2b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -13950,6 +13950,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt47744.kt"); } + @Test + @TestMetadata("kt49829.kt") + public void testKt49829() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/builderInference/kt49829.kt"); + } + @Test @TestMetadata("labaledCall.kt") public void testLabaledCall() throws Exception { diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt index 432ef019fde..f8ba9f41e69 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/TypeUtils.kt @@ -24,10 +24,8 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.inference.isCaptured import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.types.* -import org.jetbrains.kotlin.types.checker.KotlinTypeChecker -import org.jetbrains.kotlin.types.checker.NewCapturedType -import org.jetbrains.kotlin.types.checker.NewCapturedTypeConstructor -import org.jetbrains.kotlin.types.checker.intersectTypes +import org.jetbrains.kotlin.types.checker.* +import org.jetbrains.kotlin.types.model.SimpleTypeMarker import org.jetbrains.kotlin.types.model.TypeArgumentMarker import org.jetbrains.kotlin.types.model.TypeVariableTypeConstructorMarker import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -391,3 +389,13 @@ private fun NewCapturedType.unCaptureTopLevelType(): UnwrappedType { fun KotlinType?.shouldBeUpdated() = this == null || contains { it is StubTypeForBuilderInference || it.constructor is TypeVariableTypeConstructorMarker || it.isError } + +fun KotlinType.isStubType() = this is AbstractStubType || isDefNotNullStubType() + +fun KotlinType.isStubTypeForVariableInSubtyping(): Boolean = + this is StubTypeForTypeVariablesInSubtyping || isDefNotNullStubType() + +fun KotlinType.isStubTypeForBuilderInference(): Boolean = + this is StubTypeForBuilderInference || isDefNotNullStubType() + +private inline fun KotlinType.isDefNotNullStubType() = this is DefinitelyNotNullType && this.original is S diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt index c81009fca55..171deec1e85 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/ClassicTypeSystemContext.kt @@ -30,6 +30,9 @@ import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.types.typeUtil.isSignedOrUnsignedNumberType as classicIsSignedOrUnsignedNumberType +import org.jetbrains.kotlin.types.typeUtil.isStubTypeForVariableInSubtyping as isSimpleTypeStubTypeForVariableInSubtyping +import org.jetbrains.kotlin.types.typeUtil.isStubTypeForBuilderInference as isSimpleTypeStubTypeForBuilderInference +import org.jetbrains.kotlin.types.typeUtil.isStubType as isSimpleTypeStubType interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSystemCommonBackendContext { override fun TypeConstructorMarker.isDenotable(): Boolean { @@ -86,20 +89,17 @@ interface ClassicTypeSystemContext : TypeSystemInferenceExtensionContext, TypeSy override fun SimpleTypeMarker.isStubType(): Boolean { require(this is SimpleType, this::errorMessage) - return this is AbstractStubType || isDefNotNullStubType() + return this.isSimpleTypeStubType() } - private inline fun SimpleTypeMarker.isDefNotNullStubType() = - this is DefinitelyNotNullType && this.original is S - override fun SimpleTypeMarker.isStubTypeForVariableInSubtyping(): Boolean { require(this is SimpleType, this::errorMessage) - return this is StubTypeForTypeVariablesInSubtyping || isDefNotNullStubType() + return this.isSimpleTypeStubTypeForVariableInSubtyping() } override fun SimpleTypeMarker.isStubTypeForBuilderInference(): Boolean { require(this is SimpleType, this::errorMessage) - return this is StubTypeForBuilderInference || isDefNotNullStubType() + return this.isSimpleTypeStubTypeForBuilderInference() } override fun TypeConstructorMarker.unwrapStubTypeVariableConstructor(): TypeConstructorMarker {