Skip to content

Instantly share code, notes, and snippets.

@breandan
Last active December 28, 2021 01:46
Show Gist options
  • Select an option

  • Save breandan/ce4ab354efe88f7e1347a9daa7a5d015 to your computer and use it in GitHub Desktop.

Select an option

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
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