Annotation on a function literal cannot be written to binary if it has FUNCTION target and the literal is inlined
This commit is contained in:
@@ -1,16 +1,38 @@
|
||||
@Target(AnnotationTarget.FUNCTION)
|
||||
annotation class FunAnn
|
||||
|
||||
@Target(AnnotationTarget.FUNCTION)
|
||||
@Retention(AnnotationRetention.SOURCE)
|
||||
annotation class SourceAnn
|
||||
|
||||
@Target(AnnotationTarget.EXPRESSION)
|
||||
annotation class ExprAnn
|
||||
|
||||
fun bar(arg: () -> Int) = arg()
|
||||
|
||||
inline fun fast(arg: () -> Int) = arg()
|
||||
|
||||
inline fun fast2(x: Int, arg: () -> Int) = x + arg()
|
||||
|
||||
@FunAnn fun gav() = 13
|
||||
|
||||
fun foo(arg: Int) {
|
||||
// Literal is annotatable
|
||||
bar @FunAnn { arg }
|
||||
// Annotatable in principle but useless, fast is inline
|
||||
fast <!NON_SOURCE_ANNOTATION_ON_INLINED_FUNCTION_LITERAL!>@FunAnn<!> { arg }
|
||||
fast2(1, <!NON_SOURCE_ANNOTATION_ON_INLINED_FUNCTION_LITERAL!>@FunAnn<!> { arg })
|
||||
// Source annotation, ok
|
||||
fast @SourceAnn { arg }
|
||||
fast2(1, @SourceAnn { arg })
|
||||
// Expression annotation, ok
|
||||
fast @ExprAnn { arg }
|
||||
fast2(1, @ExprAnn { arg })
|
||||
// Function expression too
|
||||
val f = @FunAnn fun(): Int { return 42 }
|
||||
// But here, f and gav should be annotated instead
|
||||
bar(<!WRONG_ANNOTATION_TARGET!>@FunAnn<!> f)
|
||||
bar(<!WRONG_ANNOTATION_TARGET!>@FunAnn<!> ::gav)
|
||||
// Function expression, ok
|
||||
fast(f)
|
||||
}
|
||||
@@ -1,12 +1,28 @@
|
||||
package
|
||||
|
||||
public fun bar(/*0*/ arg: () -> kotlin.Int): kotlin.Int
|
||||
@kotlin.inline() public fun fast(/*0*/ arg: () -> kotlin.Int): kotlin.Int
|
||||
@kotlin.inline() public fun fast2(/*0*/ x: kotlin.Int, /*1*/ arg: () -> kotlin.Int): kotlin.Int
|
||||
public fun foo(/*0*/ arg: kotlin.Int): kotlin.Unit
|
||||
@FunAnn() public fun gav(): kotlin.Int
|
||||
|
||||
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.EXPRESSION}) @kotlin.annotation.annotation() public final class ExprAnn : kotlin.Annotation {
|
||||
public constructor ExprAnn()
|
||||
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
|
||||
}
|
||||
|
||||
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) @kotlin.annotation.annotation() public final class FunAnn : kotlin.Annotation {
|
||||
public constructor FunAnn()
|
||||
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
|
||||
}
|
||||
|
||||
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.FUNCTION}) @kotlin.annotation.Retention(value = AnnotationRetention.SOURCE) @kotlin.annotation.annotation() public final class SourceAnn : kotlin.Annotation {
|
||||
public constructor SourceAnn()
|
||||
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