Fix ambiguity on reference inside blocks of special functions

#KT-37058 Fixed
This commit is contained in:
Mikhail Zarechenskiy
2020-06-26 09:22:00 +03:00
parent c2c139ef4f
commit ea5fef76d1
9 changed files with 185 additions and 13 deletions
@@ -0,0 +1,25 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface A
interface B
fun foo(a: A) {}
fun foo(b: B) {}
fun bar(a: A) {}
val l0: (A) -> Unit
get() =
if (1 < 2) {
::foo
} else {
::bar
}
val l1: (A) -> Unit
get() = when {
true -> ::foo
false -> { ::foo }
else -> ::bar
}
@@ -0,0 +1,19 @@
package
public val l0: (A) -> kotlin.Unit
public val l1: (A) -> kotlin.Unit
public fun bar(/*0*/ a: A): kotlin.Unit
public fun foo(/*0*/ a: A): kotlin.Unit
public fun foo(/*0*/ b: B): kotlin.Unit
public interface 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
}
public interface 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
}
@@ -0,0 +1,25 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface A
interface B
object C : A, B
fun foo(a: A): Int = 0
fun foo(b: B): Double = 0.0
fun bar(a: A): Int = 0
val l0: Int
get() =
if (1 < 2) {
<!AMBIGUITY!>foo<!>(C)
} else {
bar(C)
}
val l1: Int
get() = when {
true -> <!AMBIGUITY!>foo<!>(C)
false -> { <!AMBIGUITY!>foo<!>(C) }
else -> bar(C)
}
@@ -0,0 +1,25 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
interface A
interface B
object C : A, B
fun foo(a: A): Int = 0
fun foo(b: B): Double = 0.0
fun bar(a: A): Int = 0
val l0: Int
get() =
if (1 < 2) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>(C)
} else {
bar(C)
}
val l1: Int
get() = when {
true -> <!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>(C)
false -> { <!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>(C) }
else -> bar(C)
}
@@ -0,0 +1,26 @@
package
public val l0: kotlin.Int
public val l1: kotlin.Int
public fun bar(/*0*/ a: A): kotlin.Int
public fun foo(/*0*/ a: A): kotlin.Int
public fun foo(/*0*/ b: B): kotlin.Double
public interface 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
}
public interface 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
}
public object C : A, B {
private constructor C()
public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String
}