Approximate anonymous return types for private inline functions to explicit supertype or Any (KT-33917)
This commit is contained in:
committed by
Dmitriy Novozhilov
parent
670f029bdf
commit
ba44ad1aa3
+52
@@ -0,0 +1,52 @@
|
||||
// !LANGUAGE: +ApproximateAnonymousReturnTypesInPrivateInlineFunctions
|
||||
|
||||
private inline fun foo1(crossinline f: () -> Int) = object {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
interface I1
|
||||
interface I2
|
||||
|
||||
private inline fun foo2(crossinline f: () -> Int) = object : I1 {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
private inline fun foo3(crossinline f: () -> Int) = object : I1, I2 {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
private fun foo4(f: () -> Int) = object {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
fun test1(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("<anonymous>")!>foo1 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("<anonymous>")!>foo1 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
|
||||
fun test2(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("I1")!>foo2 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("I1")!>foo2 { 2 }<!>
|
||||
}
|
||||
x.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
}
|
||||
|
||||
fun test3(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot hide local type object : R|I1|, R|I2| { private constructor(): R|<anonymous>| { super<R|kotlin/Any|>() } public final fun bar(): R|kotlin/Int| { ^bar R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Int|>|() }}")!>foo3 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot hide local type object : R|I1|, R|I2| { private constructor(): R|<anonymous>| { super<R|kotlin/Any|>() } public final fun bar(): R|kotlin/Int| { ^bar R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Int|>|() }}")!>foo3 { 2 }<!>
|
||||
}
|
||||
x.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
}
|
||||
|
||||
fun test4(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("<anonymous>")!>foo4 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("<anonymous>")!>foo4 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
// !LANGUAGE: +ApproximateAnonymousReturnTypesInPrivateInlineFunctions
|
||||
|
||||
private inline fun foo1(crossinline f: () -> Int) = object {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
interface I1
|
||||
interface I2
|
||||
|
||||
private inline fun foo2(crossinline f: () -> Int) = object : I1 {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>private inline fun foo3(crossinline f: () -> Int)<!> = object : I1, I2 {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
private fun foo4(f: () -> Int) = object {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
fun test1(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any")!>foo1 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any")!>foo1 { 2 }<!>
|
||||
}
|
||||
x.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
}
|
||||
|
||||
fun test2(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("I1")!>foo2 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("I1")!>foo2 { 2 }<!>
|
||||
}
|
||||
x.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
}
|
||||
|
||||
fun test3(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("foo3.<no name provided>")!>foo3 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("foo3.<no name provided>")!>foo3 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
|
||||
fun test4(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("foo4.<no name provided>")!>foo4 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("foo4.<no name provided>")!>foo4 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package
|
||||
|
||||
private inline fun foo1(/*0*/ crossinline f: () -> kotlin.Int): kotlin.Any
|
||||
private inline fun foo2(/*0*/ crossinline f: () -> kotlin.Int): I1
|
||||
private inline fun foo3(/*0*/ crossinline f: () -> kotlin.Int): foo3.<no name provided>
|
||||
private fun foo4(/*0*/ f: () -> kotlin.Int): foo4.<no name provided>
|
||||
public fun test1(/*0*/ b: kotlin.Boolean): kotlin.Unit
|
||||
public fun test2(/*0*/ b: kotlin.Boolean): kotlin.Unit
|
||||
public fun test3(/*0*/ b: kotlin.Boolean): kotlin.Unit
|
||||
public fun test4(/*0*/ b: kotlin.Boolean): kotlin.Unit
|
||||
|
||||
public interface I1 {
|
||||
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 I2 {
|
||||
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
|
||||
}
|
||||
+46
-5
@@ -1,11 +1,52 @@
|
||||
private inline fun foo(crossinline f: () -> Int) = object {
|
||||
// !LANGUAGE: -ApproximateAnonymousReturnTypesInPrivateInlineFunctions
|
||||
|
||||
private inline fun foo1(crossinline f: () -> Int) = object {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
fun test(b: Boolean) {
|
||||
var x = foo { 1 }
|
||||
interface I1
|
||||
interface I2
|
||||
|
||||
private inline fun foo2(crossinline f: () -> Int) = object : I1 {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
private inline fun foo3(crossinline f: () -> Int) = object : I1, I2 {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
private fun foo4(f: () -> Int) = object {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
fun test1(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("<anonymous>")!>foo1 { 1 }<!>
|
||||
if (b) {
|
||||
x = foo { 2 }
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("<anonymous>")!>foo1 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
}
|
||||
|
||||
fun test2(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("I1")!>foo2 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("I1")!>foo2 { 2 }<!>
|
||||
}
|
||||
x.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
}
|
||||
|
||||
fun test3(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot hide local type object : R|I1|, R|I2| { private constructor(): R|<anonymous>| { super<R|kotlin/Any|>() } public final fun bar(): R|kotlin/Int| { ^bar R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Int|>|() }}")!>foo3 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("ERROR CLASS: Cannot hide local type object : R|I1|, R|I2| { private constructor(): R|<anonymous>| { super<R|kotlin/Any|>() } public final fun bar(): R|kotlin/Int| { ^bar R|<local>/f|.R|SubstitutionOverride<kotlin/Function0.invoke: R|kotlin/Int|>|() }}")!>foo3 { 2 }<!>
|
||||
}
|
||||
x.<!UNRESOLVED_REFERENCE!>bar<!>()
|
||||
}
|
||||
|
||||
fun test4(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("<anonymous>")!>foo4 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("<anonymous>")!>foo4 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
|
||||
@@ -1,11 +1,52 @@
|
||||
private inline fun <!PRIVATE_INLINE_FUNCTIONS_RETURNING_ANONYMOUS_OBJECTS!>foo<!>(crossinline f: () -> Int) = object {
|
||||
// !LANGUAGE: -ApproximateAnonymousReturnTypesInPrivateInlineFunctions
|
||||
|
||||
private inline fun <!PRIVATE_INLINE_FUNCTIONS_RETURNING_ANONYMOUS_OBJECTS!>foo1<!>(crossinline f: () -> Int) = object {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
fun test(b: Boolean) {
|
||||
var x = foo { 1 }
|
||||
interface I1
|
||||
interface I2
|
||||
|
||||
private inline fun foo2(crossinline f: () -> Int) = object : I1 {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
private inline fun foo3(crossinline f: () -> Int) = object : I1, I2 {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
private fun foo4(f: () -> Int) = object {
|
||||
fun bar(): Int = f()
|
||||
}
|
||||
|
||||
fun test1(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("foo1.<no name provided>")!>foo1 { 1 }<!>
|
||||
if (b) {
|
||||
x = foo { 2 }
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("foo1.<no name provided>")!>foo1 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
}
|
||||
|
||||
fun test2(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("foo2.<no name provided>")!>foo2 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("foo2.<no name provided>")!>foo2 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
|
||||
fun test3(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("foo3.<no name provided>")!>foo3 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("foo3.<no name provided>")!>foo3 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
|
||||
fun test4(b: Boolean) {
|
||||
var x = <!DEBUG_INFO_EXPRESSION_TYPE("foo4.<no name provided>")!>foo4 { 1 }<!>
|
||||
if (b) {
|
||||
x = <!DEBUG_INFO_EXPRESSION_TYPE("foo4.<no name provided>")!>foo4 { 2 }<!>
|
||||
}
|
||||
x.bar()
|
||||
}
|
||||
|
||||
@@ -1,4 +1,22 @@
|
||||
package
|
||||
|
||||
private inline fun foo(/*0*/ crossinline f: () -> kotlin.Int): foo.<no name provided>
|
||||
public fun test(/*0*/ b: kotlin.Boolean): kotlin.Unit
|
||||
private inline fun foo1(/*0*/ crossinline f: () -> kotlin.Int): foo1.<no name provided>
|
||||
private inline fun foo2(/*0*/ crossinline f: () -> kotlin.Int): foo2.<no name provided>
|
||||
private inline fun foo3(/*0*/ crossinline f: () -> kotlin.Int): foo3.<no name provided>
|
||||
private fun foo4(/*0*/ f: () -> kotlin.Int): foo4.<no name provided>
|
||||
public fun test1(/*0*/ b: kotlin.Boolean): kotlin.Unit
|
||||
public fun test2(/*0*/ b: kotlin.Boolean): kotlin.Unit
|
||||
public fun test3(/*0*/ b: kotlin.Boolean): kotlin.Unit
|
||||
public fun test4(/*0*/ b: kotlin.Boolean): kotlin.Unit
|
||||
|
||||
public interface I1 {
|
||||
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 I2 {
|
||||
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