Add diagnostics for default lambda inlining

This commit is contained in:
Mikhael Bogdanov
2017-05-15 16:52:15 +02:00
parent 81c2e1dd8c
commit 0ac23c789e
15 changed files with 282 additions and 14 deletions
@@ -0,0 +1,48 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
// !LANGUAGE: -InlineDefaultFunctionalParameters
fun test() = "OK"
val prop = "OK"
class Foo {
fun test() = "OK"
val prop = "OK"
}
object FooObject {
fun test() = "OK"
val prop = "OK"
}
inline fun default1(<!NOT_YET_SUPPORTED_IN_INLINE!>s : () -> String = { "OK" }<!>) {}
inline fun default2(<!NOT_YET_SUPPORTED_IN_INLINE!>s : () -> String = ::test<!>) {}
inline fun default3(<!NOT_YET_SUPPORTED_IN_INLINE!>s : () -> String = ::prop<!>) {}
inline fun default4(<!NOT_YET_SUPPORTED_IN_INLINE!>s : () -> String = FooObject::test<!>) {}
inline fun default5(<!NOT_YET_SUPPORTED_IN_INLINE!>s : () -> String = FooObject::prop<!>) {}
inline fun default6(<!NOT_YET_SUPPORTED_IN_INLINE!>s : (a: Foo) -> String = Foo::test<!>) {}
inline fun default7(<!NOT_YET_SUPPORTED_IN_INLINE!>s : (a: Foo) -> String = Foo::prop<!>) {}
val a = Foo()
inline fun default8(<!NOT_YET_SUPPORTED_IN_INLINE!>s : () -> String = a::test<!>) {}
inline fun default9(<!NOT_YET_SUPPORTED_IN_INLINE!>s : () -> String = a::prop<!>) {}
inline fun default10(<!NOT_YET_SUPPORTED_IN_INLINE!>s : () -> String = object : Function0<String> {
override fun invoke(): String {
return "FAIL"
}
}<!>) {}
abstract class Base {
abstract fun foo(f: () -> Unit = { })
}
class Derived : Base() {
<!OVERRIDE_BY_INLINE!>override final inline fun foo(<!NOT_YET_SUPPORTED_IN_INLINE!>f: () -> Unit<!>)<!> {
f()
}
}
inline fun default11(<!NOT_YET_SUPPORTED_IN_INLINE!>s : () -> Derived = ::Derived<!>) {}
@@ -0,0 +1,50 @@
package
public val a: Foo
public val prop: kotlin.String = "OK"
public inline fun default1(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default10(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default11(/*0*/ s: () -> Derived = ...): kotlin.Unit
public inline fun default2(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default3(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default4(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default5(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default6(/*0*/ s: (a: Foo) -> kotlin.String = ...): kotlin.Unit
public inline fun default7(/*0*/ s: (a: Foo) -> kotlin.String = ...): kotlin.Unit
public inline fun default8(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default9(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public fun test(): kotlin.String
public abstract class Base {
public constructor Base()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(/*0*/ f: () -> kotlin.Unit = ...): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Derived : Base {
public constructor Derived()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final inline override /*1*/ fun foo(/*0*/ f: () -> kotlin.Unit = ...): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Foo {
public constructor Foo()
public final val prop: kotlin.String = "OK"
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 final fun test(): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public object FooObject {
private constructor FooObject()
public final val prop: kotlin.String = "OK"
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 final fun test(): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,47 @@
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER -UNUSED_VARIABLE -NOTHING_TO_INLINE
// !LANGUAGE: +InlineDefaultFunctionalParameters
fun test() = "OK"
val prop = "OK"
class Foo {
fun test() = "OK"
val prop = "OK"
}
object FooObject {
fun test() = "OK"
val prop = "OK"
}
inline fun default1(s : () -> String = {"OK"}) {}
inline fun default2(s : () -> String = ::test) {}
inline fun default3(s : () -> String = ::prop) {}
inline fun default4(s : () -> String = FooObject::test) {}
inline fun default5(s : () -> String = FooObject::prop) {}
inline fun default6(s : (a: Foo) -> String = Foo::test) {}
inline fun default7(s : (a: Foo) -> String = Foo::prop) {}
val a = Foo()
inline fun default8(s : () -> String = a::test) {}
inline fun default9(s : () -> String = a::prop) {}
inline fun default10(s : () -> String = <!INVALID_DEFAULT_FUNCTIONAL_PARAMETER_FOR_INLINE!>object : Function0<String><!> {
override fun invoke(): String {
return "FAIL"
}
}) {}
abstract class Base {
abstract fun foo(f: () -> Unit = { })
}
class Derived : Base() {
<!OVERRIDE_BY_INLINE!>override final inline fun foo(<!NOT_YET_SUPPORTED_IN_INLINE!>f: () -> Unit<!>)<!> {
f()
}
}
inline fun default11(s : () -> Derived = ::Derived) {}
@@ -0,0 +1,50 @@
package
public val a: Foo
public val prop: kotlin.String = "OK"
public inline fun default1(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default10(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default11(/*0*/ s: () -> Derived = ...): kotlin.Unit
public inline fun default2(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default3(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default4(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default5(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default6(/*0*/ s: (a: Foo) -> kotlin.String = ...): kotlin.Unit
public inline fun default7(/*0*/ s: (a: Foo) -> kotlin.String = ...): kotlin.Unit
public inline fun default8(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public inline fun default9(/*0*/ s: () -> kotlin.String = ...): kotlin.Unit
public fun test(): kotlin.String
public abstract class Base {
public constructor Base()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(/*0*/ f: () -> kotlin.Unit = ...): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Derived : Base {
public constructor Derived()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final inline override /*1*/ fun foo(/*0*/ f: () -> kotlin.Unit = ...): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Foo {
public constructor Foo()
public final val prop: kotlin.String = "OK"
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 final fun test(): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public object FooObject {
private constructor FooObject()
public final val prop: kotlin.String = "OK"
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 final fun test(): kotlin.String
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}