Skip to content

separate compilation of top level overloaded methods can't be selected #18673

Open
@ntnj

Description

@ntnj

Compiler version

3.4.0-RC1-bin-20231006-b1ccc6a-NIGHTLY

Minimized code

a.scala

import language.experimental.relaxedExtensionImports
class A
extension (a: A)
  def f = "a"

b.scala

import language.experimental.relaxedExtensionImports
class B
extension (b: B)
  def f = "b"

main.scala

import language.experimental.relaxedExtensionImports
@main def main() =
  val a = A()
  println(a.f)

Replit Link: https://replit.com/@replitit1/TubbyHighlevelCoordinate

Output

Compile error (edit: when compiled together)

[error] -- [E161] Naming Error: /home/runner/TubbyHighlevelCoordinate/b.scala:6:6 ------
[error] 6 |  def f = "b"
[error]   |  ^^^^^^^^^^^
[error]   |f is already defined as method f in /home/runner/TubbyHighlevelCoordinate/a.scala
[error]   |
[error]   |Note that overloaded methods must all be defined in the same group of toplevel definitions
[error] one error found

Edit: when compiled separately (a, then b, then main) - another error:

-- [E008] Not Found Error: main.scala:6:12 -------------------------------------
6 |  println(a.f)
  |          ^^^
  |        value f is not a member of example.A.
  |        An extension method was tried, but could not be fully constructed:
  |
  |            example.f(a)
  |
  |            failed with:
  |
  |                Found:    (a : example.A)
  |                Required: example.B
1 error found

Expectation

a

#16920 fixed this issue when extension methods with same names are imported from different objects, but it doesn't seem to work when extensions are defined at top level across multiple files.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions