Last active
December 28, 2021 01:46
-
-
Save breandan/ce4ab354efe88f7e1347a9daa7a5d015 to your computer and use it in GitHub Desktop.
When compiling the following code, the Kotlin 1.6.10 compiler appears hang forever. I killed it after 5+ hours. https://youtrack.jetbrains.com/issue/KT-50553
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import kotlin.jvm.JvmName | |
| fun main() { | |
| val thirteen = S2 | |
| .let { it + S4 } | |
| .let { it + S4 } | |
| .let { it + S4 } | |
| .let { it + S4 } | |
| .let { it + S4 } | |
| .let { it + S4 } | |
| .let { it + S4 } | |
| .let { it - S3 } | |
| .let { it - S3 } | |
| .let { it - S3 } | |
| .let { it - S3 } | |
| .let { it - S3 } | |
| println(thirteen.toInt()) | |
| } | |
| open class S<X>(val x: S<X>?) | |
| object O: S<O>(null) | |
| fun S<*>.toInt(i: Int = 0): Int = x?.toInt(i + 1) ?: i | |
| val S1 = S(O) | |
| val S2 = S1.plus1() | |
| val S3 = S1.plus2() | |
| val S4 = S2.plus2() | |
| val S5 = S2.plus3() | |
| val S6 = S3.plus3() | |
| val S7 = S3.plus4() | |
| val S8 = S4.plus4() | |
| private typealias L1 = S<O> | |
| private typealias L2 = S<S<O>> | |
| private typealias L3 = S<S<S<O>>> | |
| private typealias L4 = S<S<S<S<O>>>> | |
| private typealias L5 = S<S<S<S<S<O>>>>> | |
| private typealias L6 = S<S<S<S<S<S<O>>>>>> | |
| private typealias L7 = S<S<S<S<S<S<S<O>>>>>>> | |
| private typealias L8 = S<S<S<S<S<S<S<S<O>>>>>>>> | |
| private typealias Q1 = S<*> | |
| private typealias Q2<T> = S<S<T>> | |
| private typealias Q3<T> = S<S<S<T>>> | |
| private typealias Q4<T> = S<S<S<S<T>>>> | |
| private typealias Q5<T> = S<S<S<S<S<T>>>>> | |
| private typealias Q6<T> = S<S<S<S<S<S<T>>>>>> | |
| private typealias Q7<T> = S<S<S<S<S<S<S<T>>>>>>> | |
| private typealias Q8<T> = S<S<S<S<S<S<S<S<T>>>>>>>> | |
| fun <W: S<*>, X: S<W>> W.plus1(): X = S(this) as X | |
| fun <W: S<*>, X: S<W>> X.minus1(): W = x as W | |
| fun <W: S<*>, X: Q2<W>> W.plus2(): X = plus1().plus1() | |
| fun <W: S<*>, X: Q2<W>> X.minus2(): W = minus1().minus1() | |
| fun <W: S<*>, X: Q3<W>> W.plus3(): X = plus1().plus2() | |
| fun <W: S<*>, X: Q3<W>> X.minus3(): W = minus1().minus2() | |
| fun <W: S<*>, X: Q4<W>> W.plus4(): X = plus2().plus2() | |
| @JvmName("n+0") operator fun <W: S<*>> W.plus(x: O) = this | |
| @JvmName("0+n") operator fun <X: S<*>> O.plus(x: X) = x | |
| @JvmName("n+1") operator fun <W: S<*>, X: S<O>> W.plus(x: X) = plus1() | |
| @JvmName("1+n") operator fun <W: S<*>, X: S<O>> X.plus(w: W) = w.plus1() | |
| @JvmName("n-1") operator fun <W: S<*>, X: S<W>, Y: S<O>> X.minus(y: Y) = minus1() | |
| @JvmName("n÷1") operator fun <W: S<*>, X: S<O>> W.div(x: X) = this | |
| @JvmName("n*1") operator fun <W: S<*>, X: S<O>> W.times(x: X) = this | |
| @JvmName("1*n") operator fun <W: S<*>, X: S<O>> X.times(w: W) = w | |
| @JvmName("n*0") operator fun <W: S<*>> W.times(x: O) = O | |
| @JvmName("0*n") operator fun <X: S<*>> O.times(x: X) = O | |
| @JvmName("n+2") operator fun <W: L2, X: S<*>> X.plus(x: W) = plus2() | |
| @JvmName("n+3") operator fun <W: L3, X: S<*>> X.plus(x: W) = plus3() | |
| @JvmName("n+4") operator fun <W: L4, X: S<*>> X.plus(x: W) = plus4() | |
| @JvmName("n-2") operator fun <V: L2, W: S<*>, X: Q2<W>> X.minus(v: V) = minus2() | |
| @JvmName("n-3") operator fun <V: L3, W: S<*>, X: Q3<W>> X.minus(v: V) = minus3() | |
| @JvmName("n-4") operator fun <V: L4, W: S<*>, X: Q4<W>> X.minus(v: V) = minus4() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment