// TARGET_BACKEND: JVM_IR
// IGNORE_DEXING
// WITH_STDLIB
// LANGUAGE: +InstantiationOfAnnotationClasses

// MODULE: lib
// FILE: lib.kt

package a

annotation class A(val i: Int)

inline fun foo(i: Int): A = A(i)

inline fun bar(f: () -> Int): A = A(f())

// MODULE: app(lib)
// FILE: app.kt

package test

import a.*

class C {
    fun one(): A = foo(1)
    fun two(): A = bar { 2 }
}

fun box(): String {
    val one = C().one()
    val two = C().two()
    assert(one.i == 1)
    assert(two.i == 2)
    // Just like SAM wrappers, annotation implementation classes should be copied from inline functions
    // into current module to avoid compatibility problems when inline fun implementation in origin module
    // has changed (e.g. do not instantiate annotation anymore)
    assert(one.javaClass.getEnclosingClass().getName() == "test.C")
    assert(two.javaClass.getEnclosingClass().getName() == "test.C")
    return "OK"
}
