[FIR] Replace `UNSAFE_DOWNCAST_WRT_VARIANCE` with a breaking change
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt
index eeef429..32a7e23 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDataClassConverters.kt
@@ -4628,14 +4628,6 @@
token,
)
}
- add(FirErrors.UNSAFE_DOWNCAST_WRT_VARIANCE) { firDiagnostic ->
- UnsafeDowncastWrtVarianceImpl(
- firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a),
- firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.b),
- firDiagnostic as KtPsiDiagnostic,
- token,
- )
- }
add(FirErrors.CANNOT_CHECK_FOR_ERASED_DEPRECATION_WARNING) { firDiagnostic ->
CannotCheckForErasedDeprecationWarningImpl(
firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a),
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt
index bb2c181..f9826fd 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnostics.kt
@@ -3232,12 +3232,6 @@
val type: KaType
}
- interface UnsafeDowncastWrtVariance : KaFirDiagnostic<PsiElement> {
- override val diagnosticClass get() = UnsafeDowncastWrtVariance::class
- val currentType: KaType
- val futureType: KaType
- }
-
interface CannotCheckForErasedDeprecationWarning : KaFirDiagnostic<PsiElement> {
override val diagnosticClass get() = CannotCheckForErasedDeprecationWarning::class
val type: KaType
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt
index b1c0ccf..7822358 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KaFirDiagnosticsImpl.kt
@@ -3886,13 +3886,6 @@
token: KaLifetimeToken,
) : KaAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KaFirDiagnostic.CannotCheckForErased
-internal class UnsafeDowncastWrtVarianceImpl(
- override val currentType: KaType,
- override val futureType: KaType,
- firDiagnostic: KtPsiDiagnostic,
- token: KaLifetimeToken,
-) : KaAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KaFirDiagnostic.UnsafeDowncastWrtVariance
-
internal class CannotCheckForErasedDeprecationWarningImpl(
override val type: KaType,
firDiagnostic: KtPsiDiagnostic,
diff --git a/compiler/fir/analysis-tests/testData/resolve/bareTypes.fir.txt b/compiler/fir/analysis-tests/testData/resolve/bareTypes.fir.txt
index 07edaa5..85ee7f2 100644
--- a/compiler/fir/analysis-tests/testData/resolve/bareTypes.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/bareTypes.fir.txt
@@ -8,8 +8,8 @@
public abstract interface MutableString : R|MutableA<kotlin/String>| {
}
public final fun test(a: R|A<kotlin/String>|): R|kotlin/Unit| {
- (R|<local>/a| as? R|(future MutableA<out kotlin/String>) MutableA<kotlin/String>|)?.{ $subj$.R|SubstitutionOverride</MutableA.add: R|kotlin/Unit|>|(String()) }
- (R|<local>/a| as R|(future MutableA<out kotlin/String>) MutableA<kotlin/String>|).R|SubstitutionOverride</MutableA.add: R|kotlin/Unit|>|(String())
+ (R|<local>/a| as? R|MutableA<out kotlin/String>|)?.{ $subj$.R|SubstitutionOverride</MutableA.add: R|kotlin/Unit|><Inapplicable(INAPPLICABLE): /MutableA.add>#|(String()) }
+ (R|<local>/a| as R|MutableA<out kotlin/String>|).R|SubstitutionOverride</MutableA.add: R|kotlin/Unit|><Inapplicable(INAPPLICABLE): /MutableA.add>#|(String())
}
public final fun test2(a: R|A<kotlin/String>|): R|kotlin/Unit| {
lval b: R|MutableString| = (R|<local>/a| as R|MutableString|)
@@ -17,8 +17,8 @@
}
public final fun test3(a: R|A<kotlin/String>|): R|kotlin/Unit| {
when () {
- (R|<local>/a| is R|(future MutableA<out kotlin/String>) MutableA<kotlin/String>|) -> {
- R|<local>/a|.R|SubstitutionOverride</MutableA.add: R|kotlin/Unit|>|(String())
+ (R|<local>/a| is R|MutableA<out kotlin/String>|) -> {
+ R|<local>/a|.R|SubstitutionOverride</MutableA.add: R|kotlin/Unit|><Inapplicable(INAPPLICABLE): /MutableA.add>#|(String())
}
}
diff --git a/compiler/fir/analysis-tests/testData/resolve/bareTypes.kt b/compiler/fir/analysis-tests/testData/resolve/bareTypes.kt
index 7affd71..ce84ef3 100644
--- a/compiler/fir/analysis-tests/testData/resolve/bareTypes.kt
+++ b/compiler/fir/analysis-tests/testData/resolve/bareTypes.kt
@@ -1,5 +1,4 @@
-// LATEST_LV_DIFFERENCE
-// RUN_PIPELINE_TILL: BACKEND
+// RUN_PIPELINE_TILL: FRONTEND
interface A<out T>
interface MutableA<T> : A<T> {
@@ -9,8 +8,8 @@
interface MutableString : MutableA<String>
fun test(a: A<String>) {
- (a <!UNCHECKED_CAST!>as? <!UNSAFE_DOWNCAST_WRT_VARIANCE!>MutableA<!><!>)?.add("")
- (a <!UNCHECKED_CAST!>as <!UNSAFE_DOWNCAST_WRT_VARIANCE!>MutableA<!><!>).add("")
+ (a as? MutableA)?.add(<!MEMBER_PROJECTED_OUT!>""<!>)
+ (a as MutableA).add(<!MEMBER_PROJECTED_OUT!>""<!>)
}
fun test2(a: A<String>) {
@@ -19,7 +18,7 @@
}
fun test3(a: A<String>) {
- if (a is <!CANNOT_CHECK_FOR_ERASED_DEPRECATION_WARNING, UNSAFE_DOWNCAST_WRT_VARIANCE!>MutableA<!>) {
- a.add("")
+ if (a is MutableA) {
+ a.add(<!MEMBER_PROJECTED_OUT!>""<!>)
}
}
diff --git a/compiler/fir/analysis-tests/testData/resolve/bareTypes.latestLV.kt b/compiler/fir/analysis-tests/testData/resolve/bareTypes.latestLV.kt
deleted file mode 100644
index 3820b47..0000000
--- a/compiler/fir/analysis-tests/testData/resolve/bareTypes.latestLV.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-// LATEST_LV_DIFFERENCE
-// RUN_PIPELINE_TILL: BACKEND
-interface A<out T>
-
-interface MutableA<T> : A<T> {
- fun add(x: T)
-}
-
-interface MutableString : MutableA<String>
-
-fun test(a: A<String>) {
- (a as? MutableA)?.add(<!MEMBER_PROJECTED_OUT!>""<!>)
- (a as MutableA).add(<!MEMBER_PROJECTED_OUT!>""<!>)
-}
-
-fun test2(a: A<String>) {
- val b = a as MutableString
- b.add("")
-}
-
-fun test3(a: A<String>) {
- if (a is MutableA) {
- a.add(<!MEMBER_PROJECTED_OUT!>""<!>)
- }
-}
diff --git a/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.fir.txt b/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.fir.txt
index 49ce292..e7fcc27 100644
--- a/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.fir.txt
@@ -1,8 +1,8 @@
FILE: bareTypesWithFlexibleArguments.kt
public final fun <T> R|kotlin/collections/Collection<T>?|.concat(collection: R|kotlin/collections/Collection<T>|): R|kotlin/collections/Collection<T>?| {
when () {
- (this@R|/concat| is R|{kotlin/collections/LinkedHashSet=} (future {kotlin/collections/LinkedHashSet=} java/util/LinkedHashSet<out T>) java/util/LinkedHashSet<T>|) -> {
- this@R|/concat|.R|SubstitutionOverride<java/util/LinkedHashSet.addAll: R|kotlin/Boolean|>|(R|<local>/collection|)
+ (this@R|/concat| is R|{kotlin/collections/LinkedHashSet=} java/util/LinkedHashSet<out T>|) -> {
+ this@R|/concat|.R|SubstitutionOverride<java/util/LinkedHashSet.addAll: R|kotlin/Boolean|><Inapplicable(INAPPLICABLE): java/util/LinkedHashSet.addAll>#|(R|<local>/collection|)
^concat this@R|/concat|
}
}
diff --git a/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.kt b/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.kt
index 554faaa..fea9c1a 100644
--- a/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.kt
+++ b/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.kt
@@ -1,11 +1,10 @@
-// RUN_PIPELINE_TILL: BACKEND
+// RUN_PIPELINE_TILL: FRONTEND
// WITH_STDLIB
-// LATEST_LV_DIFFERENCE
// FULL_JDK
fun <T> Collection<T>?.concat(collection: Collection<T>): Collection<T>? {
- if (this is <!CANNOT_CHECK_FOR_ERASED_DEPRECATION_WARNING, UNSAFE_DOWNCAST_WRT_VARIANCE!>LinkedHashSet<!>) {
- addAll(collection)
+ if (this is LinkedHashSet) {
+ addAll(<!ARGUMENT_TYPE_MISMATCH!>collection<!>)
return this
}
return this
diff --git a/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.latestLV.kt b/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.latestLV.kt
deleted file mode 100644
index 36b91e20..0000000
--- a/compiler/fir/analysis-tests/testData/resolve/bareTypesWithFlexibleArguments.latestLV.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-// RUN_PIPELINE_TILL: BACKEND
-// WITH_STDLIB
-// LATEST_LV_DIFFERENCE
-// FULL_JDK
-
-fun <T> Collection<T>?.concat(collection: Collection<T>): Collection<T>? {
- if (this is LinkedHashSet) {
- addAll(<!ARGUMENT_TYPE_MISMATCH!>collection<!>)
- return this
- }
- return this
-}
diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/problems/smartcastToStarProjectedSubclass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/problems/smartcastToStarProjectedSubclass.fir.txt
index 3ce351f..1876ce2 100644
--- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/problems/smartcastToStarProjectedSubclass.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/problems/smartcastToStarProjectedSubclass.fir.txt
@@ -10,7 +10,7 @@
}
public final fun test_2(option: R|Option<kotlin/Pair<kotlin/String, kotlin/String>>?|): R|kotlin/Unit| {
when () {
- (R|<local>/option| is R|Option.Some<kotlin/Pair<kotlin/String, kotlin/String>>|) -> {
+ (R|<local>/option| is R|Option.Some<ft<kotlin/Pair<kotlin/String, kotlin/String>, kotlin/Pair<kotlin/String, kotlin/String>?>>|) -> {
lval x: R|kotlin/String| = R|<local>/option|.R|SubstitutionOverride</Option.Some.get: R|ft<kotlin/Pair<kotlin/String, kotlin/String>, kotlin/Pair<kotlin/String, kotlin/String>?>|>|().R|SubstitutionOverride<kotlin/Pair.first: R|kotlin/String|>|
R|<local>/x|.R|kotlin/String.length|
}
diff --git a/compiler/fir/analysis-tests/testData/resolve/types/bareWithSubjectTypeAlias.fir.txt b/compiler/fir/analysis-tests/testData/resolve/types/bareWithSubjectTypeAlias.fir.txt
index a48df1c..543f177 100644
--- a/compiler/fir/analysis-tests/testData/resolve/types/bareWithSubjectTypeAlias.fir.txt
+++ b/compiler/fir/analysis-tests/testData/resolve/types/bareWithSubjectTypeAlias.fir.txt
@@ -31,7 +31,7 @@
}
public final fun foo(): R|kotlin/Unit| {
when (lval a: R|{TA=} A<kotlin/CharSequence>| = R|/bar|()) {
- ($subj$ is R|A.B<kotlin/CharSequence>|) -> {
+ ($subj$ is R|A.B<out kotlin/CharSequence>|) -> {
R|<local>/a|.R|SubstitutionOverride</A.B.x: R|kotlin/CharSequence|>|.R|kotlin/CharSequence.length|
}
}
diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt
index 871c7aa..ba6ab75 100644
--- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt
+++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt
@@ -1612,10 +1612,6 @@
val CANNOT_CHECK_FOR_ERASED by error<PsiElement> {
parameter<ConeKotlinType>("type")
}
- val UNSAFE_DOWNCAST_WRT_VARIANCE by warning<PsiElement> {
- parameter<ConeKotlinType>("currentType")
- parameter<ConeKotlinType>("futureType")
- }
val CANNOT_CHECK_FOR_ERASED_DEPRECATION_WARNING by warning<PsiElement> {
parameter<ConeKotlinType>("type")
}
diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt
index 96644bf..3b70017 100644
--- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt
+++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt
@@ -806,7 +806,6 @@
// Casts and is-checks
val CANNOT_CHECK_FOR_ERASED: KtDiagnosticFactory1<ConeKotlinType> = KtDiagnosticFactory1("CANNOT_CHECK_FOR_ERASED", ERROR, SourceElementPositioningStrategies.DEFAULT, PsiElement::class)
- val UNSAFE_DOWNCAST_WRT_VARIANCE: KtDiagnosticFactory2<ConeKotlinType, ConeKotlinType> = KtDiagnosticFactory2("UNSAFE_DOWNCAST_WRT_VARIANCE", WARNING, SourceElementPositioningStrategies.DEFAULT, PsiElement::class)
val CANNOT_CHECK_FOR_ERASED_DEPRECATION_WARNING: KtDiagnosticFactory1<ConeKotlinType> = KtDiagnosticFactory1("CANNOT_CHECK_FOR_ERASED_DEPRECATION_WARNING", WARNING, SourceElementPositioningStrategies.DEFAULT, PsiElement::class)
val CAST_NEVER_SUCCEEDS: KtDiagnosticFactory0 = KtDiagnosticFactory0("CAST_NEVER_SUCCEEDS", WARNING, SourceElementPositioningStrategies.OPERATOR, KtBinaryExpressionWithTypeRHS::class)
val USELESS_CAST: KtDiagnosticFactory0 = KtDiagnosticFactory0("USELESS_CAST", WARNING, SourceElementPositioningStrategies.AS_TYPE, KtBinaryExpressionWithTypeRHS::class)
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt
index 8a7db2a..63da6eb 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt
@@ -7,7 +7,6 @@
import org.jetbrains.kotlin.fir.analysis.checkers.expression.*
import org.jetbrains.kotlin.fir.analysis.checkers.syntax.*
-import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirUnsafeDowncastWrtVarianceChecker
object CommonExpressionCheckers : ExpressionCheckers() {
override val annotationCallCheckers: Set<FirAnnotationCallChecker>
@@ -168,7 +167,6 @@
override val typeOperatorCallCheckers: Set<FirTypeOperatorCallChecker>
get() = setOf(
- FirUnsafeDowncastWrtVarianceChecker,
FirCastOperatorsChecker,
)
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnsafeDowncastWrtVarianceChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnsafeDowncastWrtVarianceChecker.kt
deleted file mode 100644
index e33c17c..0000000
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirUnsafeDowncastWrtVarianceChecker.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
- * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
- */
-
-package org.jetbrains.kotlin.fir.analysis.checkers.expression
-
-import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
-import org.jetbrains.kotlin.diagnostics.reportOn
-import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
-import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
-import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
-import org.jetbrains.kotlin.fir.expressions.FirTypeOperatorCall
-import org.jetbrains.kotlin.fir.types.coneType
-import org.jetbrains.kotlin.fir.types.unsafeDowncastWrtVariance
-
-object FirUnsafeDowncastWrtVarianceChecker : FirTypeOperatorCallChecker(MppCheckerKind.Common) {
- override fun check(
- expression: FirTypeOperatorCall,
- context: CheckerContext,
- reporter: DiagnosticReporter,
- ) {
- val typeRef = expression.conversionTypeRef
-
- typeRef.coneType.attributes.unsafeDowncastWrtVariance?.let {
- reporter.reportOn(typeRef.source, FirErrors.UNSAFE_DOWNCAST_WRT_VARIANCE, typeRef.coneType, it.coneType, context)
- }
- }
-}
\ No newline at end of file
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt
index 68c8a50..79059fc 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt
@@ -707,7 +707,6 @@
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNRESOLVED_REFERENCE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNRESOLVED_REFERENCE_WRONG_RECEIVER
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSAFE_CALL
-import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSAFE_DOWNCAST_WRT_VARIANCE
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSAFE_IMPLICIT_INVOKE_CALL
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSAFE_INFIX_CALL
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSAFE_OPERATOR_CALL
@@ -2601,12 +2600,6 @@
"This check for instance of erased type ''{0}'' will be prohibited in future releases.",
RENDER_TYPE,
)
- map.put(
- UNSAFE_DOWNCAST_WRT_VARIANCE,
- "This type is currently considered as ''{0}'' but will become ''{1}'' in future releases.",
- RENDER_TYPE,
- RENDER_TYPE,
- )
map.put(CAST_NEVER_SUCCEEDS, "This cast can never succeed.")
map.put(USELESS_CAST, "No cast needed.")
map.put(UNCHECKED_CAST, "Unchecked cast of ''{0}'' to ''{1}''.", RENDER_TYPE, RENDER_TYPE)
diff --git a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/UnsafeDowncastWrtVarianceAttribute.kt b/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/UnsafeDowncastWrtVarianceAttribute.kt
deleted file mode 100644
index deed2f9..0000000
--- a/compiler/fir/cones/src/org/jetbrains/kotlin/fir/types/UnsafeDowncastWrtVarianceAttribute.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2010-2025 JetBrains s.r.o. and Kotlin Programming Language contributors.
- * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
- */
-
-package org.jetbrains.kotlin.fir.types
-
-import kotlin.reflect.KClass
-
-class UnsafeDowncastWrtVarianceAttribute(
- override val coneType: ConeKotlinType,
-) : ConeAttributeWithConeType<UnsafeDowncastWrtVarianceAttribute>() {
- override fun union(other: UnsafeDowncastWrtVarianceAttribute?): UnsafeDowncastWrtVarianceAttribute? = null
- override fun intersect(other: UnsafeDowncastWrtVarianceAttribute?): UnsafeDowncastWrtVarianceAttribute? = null
- override fun add(other: UnsafeDowncastWrtVarianceAttribute?): UnsafeDowncastWrtVarianceAttribute = other ?: this
- override fun isSubtypeOf(other: UnsafeDowncastWrtVarianceAttribute?): Boolean = true
- override fun toString(): String = "(future ${coneType.renderForDebugging()})"
- override fun copyWith(newType: ConeKotlinType): UnsafeDowncastWrtVarianceAttribute = UnsafeDowncastWrtVarianceAttribute(newType)
-
- override val key: KClass<out UnsafeDowncastWrtVarianceAttribute>
- get() = UnsafeDowncastWrtVarianceAttribute::class
- override val keepInInferredDeclarationType: Boolean
- get() = true
-}
-
-val ConeAttributes.unsafeDowncastWrtVariance: UnsafeDowncastWrtVarianceAttribute? by ConeAttributes.attributeAccessor<UnsafeDowncastWrtVarianceAttribute>()
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/bareTypes.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/bareTypes.kt
index 9e119f1..c14d8b4 100644
--- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/bareTypes.kt
+++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/bareTypes.kt
@@ -72,8 +72,7 @@
return when {
properStaticallyKnownType == null -> staticallyKnownType
- staticallyKnownType.equalTypes(properStaticallyKnownType, session) -> staticallyKnownType
- else -> staticallyKnownType.withAdditionalAttribute(UnsafeDowncastWrtVarianceAttribute(properStaticallyKnownType))
+ else -> properStaticallyKnownType
}
}
diff --git a/compiler/testData/codegen/box/contracts/kt45236.jvm_abi.txt b/compiler/testData/codegen/box/contracts/kt45236.jvm_abi.txt
index 069b8c71..5770aa2 100644
--- a/compiler/testData/codegen/box/contracts/kt45236.jvm_abi.txt
+++ b/compiler/testData/codegen/box/contracts/kt45236.jvm_abi.txt
@@ -1,6 +1,16 @@
MODULE main
CLASS Kt45236Kt.class
PACKAGE METADATA
+ FUNCTION isError(LNetRequestStatus;)Z
+ Property: class.metadata.function.contract
+ K1
+ contract {
+ returns(true) implies (p#0 is NetRequestStatus.Error<T#0>)
+ }
+ K2
+ contract {
+ returns(true) implies (p#0 is NetRequestStatus.Error<out T#0>)
+ }
FUNCTION successOrThrow()V
Property: class.metadata.function.typeParameters
K1
diff --git a/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.fir.kt b/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.fir.kt
deleted file mode 100644
index b48c8f7..0000000
--- a/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.fir.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-// LATEST_LV_DIFFERENCE
-// RUN_PIPELINE_TILL: BACKEND
-// ISSUE: KT-57095
-
-open class ValueType<T> {
- class Optional<T>: ValueType<T?>()
-}
-
-private fun checkType(type: ValueType<out Any?>) {
- type <!UNCHECKED_CAST!>as <!UNSAFE_DOWNCAST_WRT_VARIANCE!>ValueType.Optional<!><!>
-}
diff --git a/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.kt b/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.kt
index 0b94ba6..d548236 100644
--- a/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.kt
+++ b/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.kt
@@ -1,4 +1,4 @@
-// LATEST_LV_DIFFERENCE
+// FIR_IDENTICAL
// RUN_PIPELINE_TILL: BACKEND
// ISSUE: KT-57095
diff --git a/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.latestLV.kt b/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.latestLV.kt
deleted file mode 100644
index 0b94ba6..0000000
--- a/compiler/testData/diagnostics/tests/rawCastToStarProjection_Ok.latestLV.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-// LATEST_LV_DIFFERENCE
-// RUN_PIPELINE_TILL: BACKEND
-// ISSUE: KT-57095
-
-open class ValueType<T> {
- class Optional<T>: ValueType<T?>()
-}
-
-private fun checkType(type: ValueType<out Any?>) {
- type as ValueType.Optional
-}
diff --git a/compiler/testData/diagnostics/tests/smartCasts/comparisonOfBuiltInTypesUnderOr.fir.kt b/compiler/testData/diagnostics/tests/smartCasts/comparisonOfBuiltInTypesUnderOr.fir.kt
index 83e2e67..ae5cdcd 100644
--- a/compiler/testData/diagnostics/tests/smartCasts/comparisonOfBuiltInTypesUnderOr.fir.kt
+++ b/compiler/testData/diagnostics/tests/smartCasts/comparisonOfBuiltInTypesUnderOr.fir.kt
@@ -111,13 +111,13 @@
}
fun test13(list: List<String>?) {
- if (list is <!CANNOT_CHECK_FOR_ERASED_DEPRECATION_WARNING, UNSAFE_DOWNCAST_WRT_VARIANCE!>ArrayList<!> || list == null) {
- var k: ArrayList<String>? = list
+ if (list is ArrayList || list == null) {
+ var k: ArrayList<String>? = <!INITIALIZER_TYPE_MISMATCH!>list<!>
}
}
fun test14(list: List<String>?) {
- if (list is <!CANNOT_CHECK_FOR_ERASED_DEPRECATION_WARNING, UNSAFE_DOWNCAST_WRT_VARIANCE!>ArrayList<!> || list != null) {
+ if (list is ArrayList || list != null) {
var k: ArrayList<String>? = <!INITIALIZER_TYPE_MISMATCH!>list<!>
}
}
\ No newline at end of file
diff --git a/compiler/testData/ir/irText/regressions/kt45236.fir.ir.txt b/compiler/testData/ir/irText/regressions/kt45236.fir.ir.txt
index 93c26bc..aa0a12e 100644
--- a/compiler/testData/ir/irText/regressions/kt45236.fir.ir.txt
+++ b/compiler/testData/ir/irText/regressions/kt45236.fir.ir.txt
@@ -186,7 +186,7 @@
$receiver: VALUE_PARAMETER name:<this> type:<root>.NetRequestStatus<T of <root>.isError>
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun isError <T> (): kotlin.Boolean declared in <root>'
- TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=<root>.NetRequestStatus.Error<T of <root>.isError>
+ TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=<root>.NetRequestStatus.Error<out T of <root>.isError>
GET_VAR '<this>: <root>.NetRequestStatus<T of <root>.isError> declared in <root>.isError' type=<root>.NetRequestStatus<T of <root>.isError> origin=null
FUN name:successOrThrow visibility:public modality:FINAL <T> () returnType:kotlin.Unit
TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any] reified:false
@@ -202,5 +202,5 @@
$receiver: GET_VAR 'val nextTerminal: <root>.NetRequestStatus<T of <root>.successOrThrow> declared in <root>.successOrThrow' type=<root>.NetRequestStatus<T of <root>.successOrThrow> origin=null
then: THROW type=kotlin.Nothing
CALL 'public final fun <get-error> (): kotlin.Throwable declared in <root>.NetRequestStatus.Error' type=kotlin.Throwable origin=GET_PROPERTY
- $this: TYPE_OP type=<root>.NetRequestStatus.Error<T of <root>.successOrThrow> origin=IMPLICIT_CAST typeOperand=<root>.NetRequestStatus.Error<T of <root>.successOrThrow>
+ $this: TYPE_OP type=<root>.NetRequestStatus.Error<out T of <root>.successOrThrow> origin=IMPLICIT_CAST typeOperand=<root>.NetRequestStatus.Error<out T of <root>.successOrThrow>
GET_VAR 'val nextTerminal: <root>.NetRequestStatus<T of <root>.successOrThrow> declared in <root>.successOrThrow' type=<root>.NetRequestStatus<T of <root>.successOrThrow> origin=null