Description
EDIT: This no longer loops but emits an error when it shouldn't, see discussion starting at #13900 (comment)
Originally posted by @soronpo in #13878 (comment)
Minimized code:
https://scastie.scala-lang.org/5GNoOjh1SwSUuVMBTzRqFA
import compiletime.ops.int.Max
import scala.annotation.targetName
opaque type Inlined[T] = T
object Inlined:
extension [T](inlined: Inlined[T]) def value: T = inlined
inline given fromValue[T <: Singleton]: Conversion[T, Inlined[T]] =
value => value
@targetName("fromValueWide")
given fromValue[Wide]: Conversion[Wide, Inlined[Wide]] = value => value
def forced[T](value: Any): Inlined[T] = value.asInstanceOf[T]
extension [T <: Int](lhs: Inlined[T])
def max[R <: Int](rhs: Inlined[R]) =
forced[Max[T, R]](lhs.value max rhs.value)
[error] 14 | forced[Max[T, R]](lhs.value max rhs.value)
[error] | ^^^^^^^^^^^^^
[error] |value max is not a member of Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[Inlined[Inlined[Inlined[...[...]]]]]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] |].
[error] |Extension methods were tried, but the search failed with:
[error] |
[error] | Recursion limit exceeded.
[error] |Maybe there is an illegal cyclic reference?
[error] |If that's not the case, you could also try to increase the stacksize using the -Xss JVM option.
[error] |A recurring operation is (inner to outer):
[error] |
[error] | subtype Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined[
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | Inlined
[error] | [
[error] | ...
[error] | Inlined
[error] | [
[error] | ...[
[error] | ...
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] | ]
[error] |] <:< Boolean
[error] one error found
The code works in 3.1.1-RC1, but fails on master.
The workaround was to change the last line to forced[Max[T, R]](math.max(lhs.value, rhs.value))