Skip to content

Unapplicable implicit conversion in scope incorrectly masks applicable implicit conversion in outer scope. #13900

@dwijnand

Description

@dwijnand

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions