| // WITH_STDLIB | |
| // WORKS_WHEN_VALUE_CLASS | |
| // ISSUE: KT-86123 | |
| // Tests callable reference class deduplication with nested value classes. | |
| // A value class wrapping another value class, which in turn wraps a primitive. | |
| // Also tests value classes wrapping non-primitive types (String). | |
| // --- Nested value class: Inner wraps primitive, Outer wraps Inner --- | |
| OPTIONAL_JVM_INLINE_ANNOTATION | |
| value class Inner(val x: Long) | |
| OPTIONAL_JVM_INLINE_ANNOTATION | |
| value class Outer(val i: Inner) | |
| fun captureOuter(o: Outer): () -> String = { o.toString() } | |
| fun captureOuterNullable(o: Outer?): () -> String = { o.toString() } | |
| fun captureInner(i: Inner): () -> String = { i.toString() } | |
| fun captureInnerNullable(i: Inner?): () -> String = { i.toString() } | |
| // --- Value class wrapping non-primitive (String) --- | |
| OPTIONAL_JVM_INLINE_ANNOTATION | |
| value class WrapString(val s: String) | |
| fun captureWrapString(w: WrapString): () -> String = { w.s } | |
| fun captureWrapStringNullable(w: WrapString?): () -> String = { w?.s ?: "null" } | |
| // --- Nested value class wrapping non-primitive --- | |
| OPTIONAL_JVM_INLINE_ANNOTATION | |
| value class WrapWrapString(val w: WrapString) | |
| fun captureWrapWrapString(w: WrapWrapString): () -> String = { w.w.s } | |
| fun captureWrapWrapStringNullable(w: WrapWrapString?): () -> String = { w?.w?.s ?: "null" } | |
| fun box(): String { | |
| // Inner (value class wrapping Long): non-nullable vs nullable | |
| val i = captureInner(Inner(10)) | |
| val iN = captureInnerNullable(Inner(10)) | |
| val iNull = captureInnerNullable(null) | |
| if (i() != "Inner(x=10)") return "FAIL i: ${i()}" | |
| if (iN() != "Inner(x=10)") return "FAIL iN: ${iN()}" | |
| if (iNull() != "null") return "FAIL iNull: ${iNull()}" | |
| // Outer (value class wrapping Inner wrapping Long): non-nullable vs nullable | |
| val o = captureOuter(Outer(Inner(20))) | |
| val oN = captureOuterNullable(Outer(Inner(20))) | |
| val oNull = captureOuterNullable(null) | |
| if (o() != "Outer(i=Inner(x=20))") return "FAIL o: ${o()}" | |
| if (oN() != "Outer(i=Inner(x=20))") return "FAIL oN: ${oN()}" | |
| if (oNull() != "null") return "FAIL oNull: ${oNull()}" | |
| // WrapString (value class wrapping String/non-primitive): non-nullable vs nullable | |
| val ws = captureWrapString(WrapString("hello")) | |
| val wsN = captureWrapStringNullable(WrapString("hello")) | |
| val wsNull = captureWrapStringNullable(null) | |
| if (ws() != "hello") return "FAIL ws: ${ws()}" | |
| if (wsN() != "hello") return "FAIL wsN: ${wsN()}" | |
| if (wsNull() != "null") return "FAIL wsNull: ${wsNull()}" | |
| // WrapWrapString (nested value class wrapping non-primitive) | |
| val wws = captureWrapWrapString(WrapWrapString(WrapString("nested"))) | |
| val wwsN = captureWrapWrapStringNullable(WrapWrapString(WrapString("nested"))) | |
| val wwsNull = captureWrapWrapStringNullable(null) | |
| if (wws() != "nested") return "FAIL wws: ${wws()}" | |
| if (wwsN() != "nested") return "FAIL wwsN: ${wwsN()}" | |
| if (wwsNull() != "null") return "FAIL wwsNull: ${wwsNull()}" | |
| return "OK" | |
| } |