blob: bf2cf4f52b06debc6d8d4b3d67fdb546eff494ae [file]
// TARGET_BACKEND: JVM
// WITH_STDLIB
// FULL_JDK
// WORKS_WHEN_VALUE_CLASS
// IGNORE_BACKEND_K1: ANY
// LANGUAGE: +ContextParameters, +ValueClasses
// PARAMETERS_METADATA
OPTIONAL_JVM_INLINE_ANNOTATION
value class B(val x: Int, val y: Int) {
context(z: Int)
fun f(regular: Int) = x + y + z + regular
context(z: B)
fun g(regular: Int) = this.x + this.y + z.x + z.y + regular
}
fun box(): String {
checkMultiFieldValueClass()
return "OK"
}
private fun checkMultiFieldValueClass() {
val b = B(3, 4)
val sum1 = with(2) { b.f(100) }
if (sum1 != 109) error(sum1.toString())
val sum2 = with(b) { b.g(100) }
if (sum2 != 114) error(sum2.toString())
for (methodName in listOf("f-impl", "g-vc4tCeU")) {
checkParameters("B", methodName)
}
}
private fun checkParameters(className: String, methodName: String) {
val method = Class.forName(className).declaredMethods.single { it.name == methodName }
val parameters = method.getParameters()
for (parameter in parameters) {
val condition = when (parameter.name) {
"\$v\$c\$B\$-this\$0", "\$v\$c\$B\$-this\$1" -> parameter.isSynthetic() && !parameter.isImplicit()
"z", "\$v\$c\$B\$-z\$0", "\$v\$c\$B\$-z\$1" -> !parameter.isSynthetic() && parameter.isImplicit()
"regular" -> !parameter.isSynthetic() && !parameter.isImplicit()
else -> error("Unknown parameter: $parameter")
}
require(condition) { "wrong modifier on parameter $parameter of $methodName: ${parameter.modifiers}" }
}
}