Skip to content

Name clash for $outer pointers of two different nesting levels #2382

Closed
@sjrd

Description

@sjrd

As minimized by @nicolasstucki:

object HelloWorld extends js.JSApp {
  def assertEquals(expect: Int, actual: Int, field: String): Unit =
    assert(expect == actual, s"Expected $field to be <$expect> but was <$actual>")

  def main() {
    val b = new B { }
    val y = new b.Y
    val z = new y.Z

    assertEquals(1, b.a, "b.a")
    assertEquals(1, z.z1, "z.z1")
    assertEquals(2, y.y, "y.y")

    assertEquals(2, z.z2, "z.z2")
    //  assertEquals(2, z.z3, "z.z3") // for variant

  }
}

trait A {
  val a: Int = 1
  class X {
    def x: Int = a
  }
}

trait B extends A {
  class Y {
    def y: Int = 2
    class Z extends X {
      def z1: Int = a
      def z2: Int = x
    }
  }
}

//// Variant that also fails
//trait B extends A {
//  class Y {
//    def y: Int = 2
//    class Z extends X {
//      def z1: Int = a
//      def z3: Int = y
//    }
//  }
//}

Metadata

Metadata

Assignees

Labels

bugConfirmed bug. Needs to be fixed.

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions