Add compiler X-flag to enable self upper bound type inference

^KT-48026 Fixed
This commit is contained in:
Victor Petukhov
2021-08-02 13:57:50 +03:00
committed by teamcityserver
parent 7567597be6
commit dc8dbad0bc
7 changed files with 76 additions and 0 deletions
+1
View File
@@ -81,6 +81,7 @@ where advanced options include:
-Xread-deserialized-contracts Enable reading of contracts from metadata
-Xreport-output-files Report source to output files mapping
-Xreport-perf Report detailed performance statistics
-Xself-upper-bound-inference Support inferring type arguments based on only self upper bounds of the corresponding type parameters
-Xskip-metadata-version-check Allow to load classes with bad metadata version and pre-release classes
-Xskip-prerelease-check Allow to load pre-release classes
-Xsuppress-version-warnings Suppress warnings about outdated, inconsistent or experimental language or API versions
+1
View File
@@ -195,6 +195,7 @@ where advanced options include:
-Xread-deserialized-contracts Enable reading of contracts from metadata
-Xreport-output-files Report source to output files mapping
-Xreport-perf Report detailed performance statistics
-Xself-upper-bound-inference Support inferring type arguments based on only self upper bounds of the corresponding type parameters
-Xskip-metadata-version-check Allow to load classes with bad metadata version and pre-release classes
-Xskip-prerelease-check Allow to load pre-release classes
-Xsuppress-version-warnings Suppress warnings about outdated, inconsistent or experimental language or API versions
@@ -0,0 +1,4 @@
$TESTDATA_DIR$/selfUpperBoundInference.kt
-d
$TEMP_DIR$
-Xself-upper-bound-inference
+51
View File
@@ -0,0 +1,51 @@
class Builder<B : Builder<B>> {
fun <T : B> test(): T = TODO()
fun foo() {}
}
fun testStar(builder: Builder<*>) {
builder.test()
builder
.test()
.foo()
}
fun <K : Builder<K>> testTypeParam(builder: Builder<K>) {
builder.test()
builder
.test()
.foo()
}
interface BodySpec<B, S : BodySpec<B, S>> {
fun <T : S> isEqualTo(expected: B): T
}
fun test(b: BodySpec<String, *>) {
b.isEqualTo("")
WriterAppender.newBuilder()
WriterAppender.Builder1()
WriterAppender.intersectTwoSelfTypes()
}
object WriterAppender {
interface Builder2<K : Builder2<K>>
class Builder1<B : Builder1<B>> {
fun asBuilder(): B {
return this as B
}
}
fun <B : Builder1<B>> newBuilder(): B {
return Builder1<B>().asBuilder()
}
fun <B> intersectTwoSelfTypes(): B where B : Builder1<B>, B: Builder2<B> {
return Builder1<B>().asBuilder()
}
}
+4
View File
@@ -0,0 +1,4 @@
compiler/testData/cli/jvm/selfUpperBoundInference.kt:40:25: warning: unchecked cast: WriterAppender.Builder1<B> to B
return this as B
^
OK