From a43a16b25b5cad54b6f46aae18fb380e6b9989ae Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 17 Mar 2023 16:01:00 +0100 Subject: [PATCH] Delay ForbidInferringPostponedTypeVariableIntoDeclaredUpperBound to 2.0 #KT-57395 Fixed Related to KT-47986 --- .../builderInference/kt47986Default.diag.txt | 11 ++- .../builderInference/kt47986Default.fir.kt | 12 ++++ .../builderInference/kt47986Default.kt | 3 +- .../builderInference/kt47986_2.diag.txt | 11 ++- .../builderInference/kt47986_2.fir.kt | 14 ++++ .../inference/builderInference/kt47986_2.kt | 3 +- .../builderInference/kt47986_3.diag.txt | 11 ++- .../builderInference/kt47986_3.fir.kt | 12 ++++ .../inference/builderInference/kt47986_3.kt | 3 +- .../builderInference/kt51464.diag.txt | 11 ++- .../inference/builderInference/kt51464.fir.kt | 13 ++++ .../inference/builderInference/kt51464.kt | 3 +- .../inference/builderInference/kt53639.kt | 4 +- .../multiLambdaRestriction.kt | 4 +- .../multiLambdaRestrictionDisabled.fir.kt | 71 +++++++++++++++++++ .../multiLambdaRestrictionDisabled.kt | 5 +- .../stubTypes/capturedTypes.kt | 4 +- .../stubTypes/commonSuperType.kt | 2 +- .../stubTypes/commonSuperTypeCovariant.kt | 2 +- .../stubTypes/commonSuperTypeNullable.kt | 4 +- .../stubTypes/stubTypeReceiverRestriction.kt | 12 ++-- .../stubTypeReceiverRestrictionDisabled.kt | 12 ++-- .../kotlin/config/LanguageVersionSettings.kt | 2 +- 23 files changed, 191 insertions(+), 38 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inference/builderInference/kt51464.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.fir.kt diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.diag.txt b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.diag.txt index 16e80d95440..efae3c025fe 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.diag.txt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.diag.txt @@ -1,4 +1,13 @@ -/kt47986Default.kt:10:13: error: not enough information to infer type variable K +/kt47986Default.kt:4:18: warning: parameter 'builderAction' is never used +fun buildFoo(builderAction: Foo.() -> Unit): Foo = Foo() + ^ +/kt47986Default.kt:6:20: warning: parameter 'x' is never used +fun Foo.bar(x: Int = 1) {} + ^ +/kt47986Default.kt:9:9: warning: variable 'x' is never used + val x = buildFoo { + ^ +/kt47986Default.kt:9:13: warning: type parameter for a type argument K can't be inferred into declared upper bounds. Please provide any use-site type information. It will become an error in future releases. val x = buildFoo { ^ diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.fir.kt new file mode 100644 index 00000000000..dd4c7d432e0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.fir.kt @@ -0,0 +1,12 @@ +// !RENDER_DIAGNOSTICS_FULL_TEXT +class Foo + +fun buildFoo(builderAction: Foo.() -> Unit): Foo = Foo() + +fun Foo.bar(x: Int = 1) {} + +fun main() { + val x = buildFoo { + bar() + } +} diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.kt index 3d4024548c5..267a0a94885 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986Default.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !RENDER_DIAGNOSTICS_FULL_TEXT class Foo @@ -7,7 +6,7 @@ fun buildFoo(builderAction: Foo.() -> Unit): Foo = Foo() fun Foo.bar(x: Int = 1) {} fun main() { - val x = buildFoo { + val x = buildFoo { bar() } } diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.diag.txt b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.diag.txt index 1ab90ac25bf..adb1163f3ef 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.diag.txt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.diag.txt @@ -1,4 +1,13 @@ -/kt47986_2.kt:12:13: error: not enough information to infer type variable K +/kt47986_2.kt:4:18: warning: parameter 'builderAction' is never used +fun buildFoo(builderAction: Foo.() -> Unit): Foo = Foo() + ^ +/kt47986_2.kt:11:9: warning: variable 'x' is never used + val x = buildFoo { // can't infer + ^ +/kt47986_2.kt:11:13: warning: type parameter for a type argument K can't be inferred into declared upper bounds. Please provide any use-site type information. It will become an error in future releases. val x = buildFoo { // can't infer ^ +/kt47986_2.kt:12:13: warning: variable 'y' is never used + val y = id(::bar) + ^ diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.fir.kt new file mode 100644 index 00000000000..ab50575f175 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.fir.kt @@ -0,0 +1,14 @@ +// !RENDER_DIAGNOSTICS_FULL_TEXT +class Foo + +fun buildFoo(builderAction: Foo.() -> Unit): Foo = Foo() + +fun Foo.bar() {} + +fun id(x: K) = x + +fun main() { + val x = buildFoo { // can't infer + val y = id(::bar) + } +} diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.kt index 9610d6406e0..f9d18502083 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_2.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !RENDER_DIAGNOSTICS_FULL_TEXT class Foo @@ -9,7 +8,7 @@ fun Foo.bar() {} fun id(x: K) = x fun main() { - val x = buildFoo { // can't infer + val x = buildFoo { // can't infer val y = id(::bar) } } diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.diag.txt b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.diag.txt index 110c49b7e5f..a6a639c0ae6 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.diag.txt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.diag.txt @@ -1,4 +1,13 @@ -/kt47986_3.kt:10:13: error: not enough information to infer type variable K +/kt47986_3.kt:4:18: warning: parameter 'builderAction' is never used +fun buildFoo(builderAction: Foo.() -> Unit): Foo = Foo() + ^ +/kt47986_3.kt:6:26: warning: parameter 'x' is never used +fun Foo.bar(x: Int = 1) {} + ^ +/kt47986_3.kt:9:9: warning: variable 'x' is never used + val x = buildFoo { + ^ +/kt47986_3.kt:9:13: warning: type parameter for a type argument K can't be inferred into declared upper bounds. Please provide any use-site type information. It will become an error in future releases. val x = buildFoo { ^ diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.fir.kt new file mode 100644 index 00000000000..cc409ec258a --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.fir.kt @@ -0,0 +1,12 @@ +// !RENDER_DIAGNOSTICS_FULL_TEXT +class Foo + +fun buildFoo(builderAction: Foo.() -> Unit): Foo = Foo() + +fun Foo.bar(x: Int = 1) {} + +fun main() { + val x = buildFoo { + bar() + } +} diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.kt index c643c2ee6fc..7a422bd3566 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt47986_3.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !RENDER_DIAGNOSTICS_FULL_TEXT class Foo @@ -7,7 +6,7 @@ fun buildFoo(builderAction: Foo.() -> Unit): Foo = Foo() fun Foo.bar(x: Int = 1) {} fun main() { - val x = buildFoo { + val x = buildFoo { bar() } } diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.diag.txt b/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.diag.txt index 788321964a2..7eb788d4c71 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.diag.txt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.diag.txt @@ -1,4 +1,13 @@ -/kt51464.kt:13:15: error: not enough information to infer type variable R +/kt51464.kt:2:16: warning: parameter 'value' is never used +fun flowOf(value: T): Flow = TODO() + ^ +/kt51464.kt:8:30: warning: parameter 'transform' is never used +fun Flow.transform(transform: FlowCollector.(T) -> Unit): Flow = TODO() + ^ +/kt51464.kt:11:20: warning: parameter 'collector' is never used + fun doEmit(collector: FlowCollector) {} + ^ +/kt51464.kt:12:15: warning: type parameter for a type argument R can't be inferred into declared upper bounds. Please provide any use-site type information. It will become an error in future releases. flowOf(1).transform { doEmit(this) } ^ diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.fir.kt new file mode 100644 index 00000000000..d22eb57c03d --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.fir.kt @@ -0,0 +1,13 @@ +// !RENDER_DIAGNOSTICS_FULL_TEXT +fun flowOf(value: T): Flow = TODO() + +interface FlowCollector {} + +interface Flow + +fun Flow.transform(transform: FlowCollector.(T) -> Unit): Flow = TODO() + +fun f() { + fun doEmit(collector: FlowCollector) {} + flowOf(1).transform { doEmit(this) } +} diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.kt index 0b588e2ceac..abd864d09a5 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt51464.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !RENDER_DIAGNOSTICS_FULL_TEXT fun flowOf(value: T): Flow = TODO() @@ -10,5 +9,5 @@ fun Flow.transform(transform: FlowCollector.(T) -> Unit): Flow = fun f() { fun doEmit(collector: FlowCollector) {} - flowOf(1).transform { doEmit(this) } + flowOf(1).transform { doEmit(this) } } diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/kt53639.kt b/compiler/testData/diagnostics/tests/inference/builderInference/kt53639.kt index 12b1cf1bee8..34ba219e2e5 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/kt53639.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/kt53639.kt @@ -10,10 +10,10 @@ data class InputWrapper(val value: TItem) data class Output(val source: InputWrapper>) fun main2(input: InputWrapper): Output { - val output = input.doMapping( + val output = input.doMapping( foo = { buildList { add("this is List") } }, bar = { it.isNotEmpty() }, ) - return Output(source = output) + return Output(source = output) } diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestriction.kt b/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestriction.kt index 611b9170fb6..3bed2aa99ae 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestriction.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestriction.kt @@ -7,7 +7,7 @@ fun List.myGenericExt() {} fun a(first: R, second: (List) -> Unit) {} fun test1() { - a( + a( buildList { add("") }, second = { it.myGenericExt() @@ -67,4 +67,4 @@ fun test4() { left = { add(1) }, right = { add("") } ) -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.fir.kt b/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.fir.kt new file mode 100644 index 00000000000..00e223e118a --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.fir.kt @@ -0,0 +1,71 @@ +// WITH_STDLIB +// LANGUAGE: +NoBuilderInferenceWithoutAnnotationRestriction +// SKIP_TXT + +fun List.myExt() {} +fun List.myGenericExt() {} + +fun a(first: R, second: (List) -> Unit) {} + +fun test1() { + a( + buildList { add("") }, + second = { + it.myGenericExt() + } + ) +} + + +fun b(first: () -> List, second: (List) -> Unit) {} + +fun test2() { + b( + first = { + buildList { add("") } + }, + second = { + it.myExt() // Note: must be extension to add constraints + } + ) +} + +fun select(a: Q, b: Q): Q = a + +// Note: no builder inference annotation +fun myBuildList(builder: MutableList.() -> Unit): List { + val list = mutableListOf() + list.builder() + return list +} + +fun test3() { + select( + buildList { add("") }, + buildList { add(1) } + ) + + select ( + myBuildList { add("") }, + myBuildList { add(1) }, + ) + + select ( + run { myBuildList { add("") } }, + myBuildList { add(1) }, + ) +} + +fun buildPartList(left: MutableList.() -> Unit, right: MutableList.() -> Unit): List { + val list = mutableListOf() + list.left() + list.right() + return list +} + +fun test4() { + buildPartList( + left = { add(1) }, + right = { add("") } + ) +} diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.kt b/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.kt index 3f85c79ab35..c21e8a69e79 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/multiLambdaRestrictionDisabled.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // WITH_STDLIB // LANGUAGE: +NoBuilderInferenceWithoutAnnotationRestriction // SKIP_TXT @@ -9,7 +8,7 @@ fun List.myGenericExt() {} fun a(first: R, second: (List) -> Unit) {} fun test1() { - a( + a( buildList { add("") }, second = { it.myGenericExt() @@ -69,4 +68,4 @@ fun test4() { left = { add(1) }, right = { add("") } ) -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/capturedTypes.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/capturedTypes.kt index 1545a713855..aeb97794c37 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/capturedTypes.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/capturedTypes.kt @@ -36,10 +36,10 @@ fun main() { capture(")!>getOut()) "" } - build { + build { emit("") // K is fixed into CapturedType(in NotFixed: TypeVariable(R)) capture(")!>getIn()) "" } -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperType.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperType.kt index e6906e50afa..6bf339a0a7d 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperType.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperType.kt @@ -42,7 +42,7 @@ fun test() { ..Inv?)")!>select(Test.foo(getInv()), getInv()) ..Inv?)")!>select(getInv(), Test.foo(getInv())) select(id(get()), id(get())) - build2 { + build2 { emit(1) select(this@build.get(), get()) select(Test.foo(this@build.get()), Test.foo(get())) diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeCovariant.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeCovariant.kt index 11e5733030e..548a237fa97 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeCovariant.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeCovariant.kt @@ -53,7 +53,7 @@ fun test() { select4(id(Test.foo(get())), getOut()) - build2 { + build2 { emit(1) select1(this@build.get(), getOut()) select1(get(), Test.foo(this@build.getOut())) diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeNullable.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeNullable.kt index 8af8237b075..4ef32d61202 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeNullable.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/commonSuperTypeNullable.kt @@ -45,7 +45,7 @@ fun test() { ?")!>select(Test.foo(getInv()), getInv()) ?")!>select(getInv(), Test.foo(getInv())) select(id(get()), id(get())) - build2 { + build2 { emit(1) select(this@build.get(), get()) select(Test.foo(this@build.get()), Test.foo(get())) @@ -67,7 +67,7 @@ fun test() { ?")!>select(Test.foo(null), getInv()) ?")!>select(getInv(), Test.foo(null)) select(id(null), id(get())) - build2 { + build2 { emit(1) select(this@build.get(), get(), null) select(Test.foo(this@build.get()), Test.foo(get()), null) diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt index 0f9eb9057cf..03466754a24 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestriction.kt @@ -8,7 +8,7 @@ fun T.extension() {} fun use(p: Any?) {} fun test1() { - a { + a { this.get(0).extension() use(this.get(0)::extension) use(it::extension) @@ -17,7 +17,7 @@ fun test1() { fun test2() { - a { + a { val v = this.get(0) v.extension() use(v::extension) @@ -27,7 +27,7 @@ fun test2() { fun test3() { operator fun T.getValue(thisRef: Any?, prop: Any?): T = this - a { + a { val v by this.get(0) v.extension() use(v::extension) @@ -40,7 +40,7 @@ class Box(val t: TIn) fun test4() { operator fun T.provideDelegate(thisRef: Any?, prop: Any?): Box = Box(this) operator fun Box.getValue(thisRef: Any?, prop: Any?): T = this.t - a { + a { val v by this.get(0) v.extension() use(v::extension) @@ -53,7 +53,7 @@ fun b(lambda: R.(List) -> Unit) {} fun test5() { operator fun T.invoke(): T = this - b { + b { extension() this().extension() use(::extension) @@ -63,7 +63,7 @@ fun test5() { val T.genericLambda: T.((T) -> Unit) -> Unit get() = {} fun test6() { - b { + b { extension() genericLambda { } genericLambda { it.extension() } diff --git a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt index 4bd4c5e5a68..29f0f9b148c 100644 --- a/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt +++ b/compiler/testData/diagnostics/tests/inference/builderInference/stubTypes/stubTypeReceiverRestrictionDisabled.kt @@ -9,7 +9,7 @@ fun T.extension() {} fun use(p: Any?) {} fun test1() { - a { + a { this.get(0).extension() use(this.get(0)::extension) use(it::extension) @@ -18,7 +18,7 @@ fun test1() { fun test2() { - a { + a { val v = this.get(0) v.extension() use(v::extension) @@ -28,7 +28,7 @@ fun test2() { fun test3() { operator fun T.getValue(thisRef: Any?, prop: Any?): T = this - a { + a { val v by this.get(0) v.extension() use(v::extension) @@ -41,7 +41,7 @@ class Box(val t: TIn) fun test4() { operator fun T.provideDelegate(thisRef: Any?, prop: Any?): Box = Box(this) operator fun Box.getValue(thisRef: Any?, prop: Any?): T = this.t - a { + a { val v by this.get(0) v.extension() use(v::extension) @@ -54,7 +54,7 @@ fun b(lambda: R.(List) -> Unit) {} fun test5() { operator fun T.invoke(): T = this - b { + b { extension() this().extension() use(::extension) @@ -64,7 +64,7 @@ fun test5() { val T.genericLambda: T.((T) -> Unit) -> Unit get() = {} fun test6() { - b { + b { extension() genericLambda { } genericLambda { it.extension() } diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index f7760b2b08c..2e5b697e8c3 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -266,7 +266,6 @@ enum class LanguageFeature( ReportTypeVarianceConflictOnQualifierArguments(KOTLIN_1_9, kind = BUG_FIX), // KT-50947 ReportErrorsOnRecursiveTypeInsidePlusAssignment(KOTLIN_1_9, kind = BUG_FIX), // KT-48546 ForbidExtensionCallsOnInlineFunctionalParameters(KOTLIN_1_9, kind = BUG_FIX), // KT-52502 - ForbidInferringPostponedTypeVariableIntoDeclaredUpperBound(KOTLIN_1_9, kind = BUG_FIX), // KT-47986 KeepNullabilityWhenApproximatingLocalType(KOTLIN_1_9, kind = BUG_FIX), // KT-53982 SkipStandaloneScriptsInSourceRoots(KOTLIN_1_9, kind = OTHER), // KT-52525 ModifierNonBuiltinSuspendFunError(KOTLIN_1_9, kind = BUG_FIX), // KT-49264 @@ -286,6 +285,7 @@ enum class LanguageFeature( EnhanceNullabilityOfPrimitiveArrays(KOTLIN_2_0, kind = BUG_FIX), // KT-54521 AllowEmptyIntersectionsInResultTypeResolver(KOTLIN_2_0, kind = OTHER), // KT-51221 ProhibitSmartcastsOnPropertyFromAlienBaseClassInheritedInInvisibleClass(KOTLIN_2_0, kind = BUG_FIX), // KT-57290 + ForbidInferringPostponedTypeVariableIntoDeclaredUpperBound(KOTLIN_2_0, kind = BUG_FIX), // KT-47986 // End of 2.* language features --------------------------------------------------