Use constraint system for comparing for specificity against a generic signature.
Drop "discrimiate generics" mode where it's unneeded.
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
object X1
|
||||
object X2
|
||||
|
||||
fun <T1> foo(x: T1, f: (T1) -> T1) = X1
|
||||
fun <T2> foo(xf: () -> T2, f: (T2) -> T2) = X2
|
||||
|
||||
val test: X2 = <!CANNOT_COMPLETE_RESOLVE!>foo<!>({ 0 }, { <!CANNOT_INFER_PARAMETER_TYPE!>it<!> -> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>it<!> <!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>+<!> 1 })
|
||||
@@ -0,0 +1,19 @@
|
||||
package
|
||||
|
||||
public val test: X2
|
||||
public fun </*0*/ T2> foo(/*0*/ xf: () -> T2, /*1*/ f: (T2) -> T2): X2
|
||||
public fun </*0*/ T1> foo(/*0*/ x: T1, /*1*/ f: (T1) -> T1): X1
|
||||
|
||||
public object X1 {
|
||||
private constructor X1()
|
||||
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
|
||||
}
|
||||
|
||||
public object X2 {
|
||||
private constructor X2()
|
||||
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
|
||||
}
|
||||
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
object Foo1
|
||||
object Foo2
|
||||
|
||||
fun foo(vararg ss: String) = Foo1
|
||||
fun foo(x: Any) = Foo2
|
||||
|
||||
val test1: Foo1 = foo("")
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
package
|
||||
|
||||
public val test1: Foo1
|
||||
public fun foo(/*0*/ x: kotlin.Any): Foo2
|
||||
public fun foo(/*0*/ vararg ss: kotlin.String /*kotlin.Array<out kotlin.String>*/): Foo1
|
||||
|
||||
public object Foo1 {
|
||||
private constructor Foo1()
|
||||
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
|
||||
}
|
||||
|
||||
public object Foo2 {
|
||||
private constructor Foo2()
|
||||
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
|
||||
}
|
||||
+1
-1
@@ -6,7 +6,7 @@ object X2
|
||||
fun overloadedFun5(vararg ss: String) = X1
|
||||
fun overloadedFun5(s: String, vararg ss: String) = X2
|
||||
|
||||
val test1: X1 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>overloadedFun5<!>("")
|
||||
val test1 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>overloadedFun5<!>("")
|
||||
val test2 = <!OVERLOAD_RESOLUTION_AMBIGUITY!>overloadedFun5<!>("", "")
|
||||
val test3: X2 = overloadedFun5(s = "", ss = "")
|
||||
val test4: X1 = overloadedFun5(ss = "")
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package
|
||||
|
||||
public val test1: X1
|
||||
public val test1: [ERROR : Type for overloadedFun5("")]
|
||||
public val test2: [ERROR : Type for overloadedFun5("", "")]
|
||||
public val test3: X2
|
||||
public val test4: X1
|
||||
|
||||
+4
-4
@@ -3,10 +3,10 @@
|
||||
import java.util.*
|
||||
|
||||
public class J {
|
||||
public static <E extends Enum<E>> String foo(E e) { return ""; }
|
||||
public static <E extends Enum<E>> String foo(E e1, E e2) { return ""; }
|
||||
public static <E extends Enum<E>> String foo(E s1, E s2, E s3) { return ""; }
|
||||
public static <E extends Enum<E>> int foo(E... ss) { return 0; }
|
||||
public static <E1 extends Enum<E1>> String foo(E1 e) { return ""; }
|
||||
public static <E2 extends Enum<E2>> String foo(E2 e1, E2 e2) { return ""; }
|
||||
public static <E3 extends Enum<E3>> String foo(E3 s1, E3 s2, E3 s3) { return ""; }
|
||||
public static <E4 extends Enum<E4>> int foo(E4... ss) { return 0; }
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
+4
-4
@@ -15,10 +15,10 @@ public open class J {
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
// Static members
|
||||
public open fun </*0*/ E : kotlin.Enum<E!>!> foo(/*0*/ e: E!): kotlin.String!
|
||||
public open fun </*0*/ E : kotlin.Enum<E!>!> foo(/*0*/ e1: E!, /*1*/ e2: E!): kotlin.String!
|
||||
public open fun </*0*/ E : kotlin.Enum<E!>!> foo(/*0*/ s1: E!, /*1*/ s2: E!, /*2*/ s3: E!): kotlin.String!
|
||||
public open fun </*0*/ E : kotlin.Enum<E!>!> foo(/*0*/ vararg ss: E! /*kotlin.Array<(out) E!>!*/): kotlin.Int
|
||||
public open fun </*0*/ E1 : kotlin.Enum<E1!>!> foo(/*0*/ e: E1!): kotlin.String!
|
||||
public open fun </*0*/ E2 : kotlin.Enum<E2!>!> foo(/*0*/ e1: E2!, /*1*/ e2: E2!): kotlin.String!
|
||||
public open fun </*0*/ E3 : kotlin.Enum<E3!>!> foo(/*0*/ s1: E3!, /*1*/ s2: E3!, /*2*/ s3: E3!): kotlin.String!
|
||||
public open fun </*0*/ E4 : kotlin.Enum<E4!>!> foo(/*0*/ vararg ss: E4! /*kotlin.Array<(out) E4!>!*/): kotlin.Int
|
||||
}
|
||||
|
||||
public final enum class X : kotlin.Enum<X> {
|
||||
@@ -0,0 +1,9 @@
|
||||
object X1
|
||||
object X2
|
||||
|
||||
class A<T>
|
||||
|
||||
fun <T1> A<T1>.foo() = X1
|
||||
fun <T2> A<out T2>.foo() = X2
|
||||
|
||||
fun <T> A<out T>.test() = <!CANNOT_COMPLETE_RESOLVE!>foo<!>()
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ T1> A<T1>.foo(): X1
|
||||
public fun </*0*/ T2> A<out T2>.foo(): X2
|
||||
public fun </*0*/ T> A<out T>.test(): [ERROR : Error function type]
|
||||
|
||||
public 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
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public object X1 {
|
||||
private constructor X1()
|
||||
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
|
||||
}
|
||||
|
||||
public object X2 {
|
||||
private constructor X2()
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user