KT-6081 Chained generic method calls: wrong type inference
#KT-6081 Fixed
This commit is contained in:
+14
@@ -0,0 +1,14 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
//KT-6081 Chained generic method calls: wrong type inference
|
||||
|
||||
class Bar<T>
|
||||
|
||||
fun bar<T>(): Bar<T> = null!!
|
||||
|
||||
class Foo {
|
||||
fun <R> add(bar: Bar<R>): Foo {return this}
|
||||
}
|
||||
|
||||
fun doesNotWork(bi: Bar<Int>, bs: Bar<String>) {
|
||||
Foo().add(bi).add(bs)
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package
|
||||
|
||||
internal fun </*0*/ T> bar(): Bar<T>
|
||||
internal fun doesNotWork(/*0*/ bi: Bar<kotlin.Int>, /*1*/ bs: Bar<kotlin.String>): kotlin.Unit
|
||||
|
||||
internal final class Bar</*0*/ T> {
|
||||
public constructor Bar</*0*/ T>()
|
||||
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
|
||||
}
|
||||
|
||||
internal final class Foo {
|
||||
public constructor Foo()
|
||||
internal final fun </*0*/ R> add(/*0*/ bar: Bar<R>): Foo
|
||||
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
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
class A<T> {
|
||||
fun useT(t: T) = t
|
||||
|
||||
fun <U> newA(): A<U> = A()
|
||||
}
|
||||
|
||||
fun test1() {
|
||||
A<Int>().newA<String>().useT("")
|
||||
A<Int>().newA<String>().useT(<!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>)
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package
|
||||
|
||||
internal fun test1(): kotlin.Unit
|
||||
|
||||
internal final class A</*0*/ T> {
|
||||
public constructor A</*0*/ T>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
internal final fun </*0*/ U> newA(): A<U>
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
internal final fun useT(/*0*/ t: T): T
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
class Test {
|
||||
private fun <T : Any> T.self() = object {
|
||||
fun bar(): T {
|
||||
return this@self
|
||||
}
|
||||
}
|
||||
fun test() {
|
||||
1.self().bar() + 1
|
||||
}
|
||||
}
|
||||
|
||||
class Foo<R> {
|
||||
private fun <T> bar() = object {
|
||||
fun baz(): Foo<R> {
|
||||
return this@Foo
|
||||
}
|
||||
}
|
||||
|
||||
fun getR(r: R) = r
|
||||
|
||||
fun test() {
|
||||
Foo<Int>().bar<String>().baz().getR(1)
|
||||
Foo<Int>().bar<String>().baz().getR(<!TYPE_MISMATCH!>""<!>)
|
||||
}
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
package
|
||||
|
||||
internal final class Foo</*0*/ R> {
|
||||
public constructor Foo</*0*/ R>()
|
||||
private final fun </*0*/ T> bar(): Foo.bar.<no name provided>
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final fun getR(/*0*/ r: R): R
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
internal final fun test(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class Test {
|
||||
public constructor Test()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
internal final fun test(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
private final fun </*0*/ T : kotlin.Any> T.self(): Test.self.<no name provided>
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
class Outer<T> {
|
||||
inner class Inner<I> {
|
||||
fun getOuter(): Outer<T> = this@Outer
|
||||
fun <R> genericFun(r: R): Outer<T> = this@Outer
|
||||
}
|
||||
fun useOuterParam(t: T) {}
|
||||
}
|
||||
|
||||
fun test1() {
|
||||
Outer<Int>().Inner<String>().getOuter().useOuterParam(22)
|
||||
Outer<Int>().Inner<String>().getOuter().useOuterParam(<!TYPE_MISMATCH!>""<!>)
|
||||
}
|
||||
|
||||
|
||||
class A
|
||||
class B
|
||||
|
||||
fun test1(a: A, b: B) {
|
||||
Outer<Int>().Inner<String>().genericFun(a).Inner<Double>().genericFun(b)
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
package
|
||||
|
||||
internal fun test1(): kotlin.Unit
|
||||
internal fun test1(/*0*/ a: A, /*1*/ b: B): kotlin.Unit
|
||||
|
||||
internal final class A {
|
||||
public constructor A()
|
||||
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
|
||||
}
|
||||
|
||||
internal final class B {
|
||||
public constructor B()
|
||||
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
|
||||
}
|
||||
|
||||
internal final class Outer</*0*/ T> {
|
||||
public constructor Outer</*0*/ T>()
|
||||
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
|
||||
internal final fun useOuterParam(/*0*/ t: T): kotlin.Unit
|
||||
|
||||
internal final inner class Inner</*0*/ I> {
|
||||
public constructor Inner</*0*/ I>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
internal final fun </*0*/ R> genericFun(/*0*/ r: R): Outer<T>
|
||||
internal final fun getOuter(): Outer<T>
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user