bug icon indicating copy to clipboard operation
bug copied to clipboard

new "cyclic aliasing or subtype" error in 2.13

Open retronym opened this issue 3 years ago • 0 comments

Reproduction steps

object repro {
  trait ScenarioParam {
    type Builder <: Type
  }

  trait ScenarioParamBuilder

  trait Type {
    type Builder <: ScenarioParamBuilder
  }

  trait Types[H <: ScenarioParam, T <: Type] extends Type {
    type Builder = H#Builder with T#Builder
  }

  trait Nil extends Type {
    type Builder = ScenarioParamBuilder
  }

  trait ScenarioTarget {
    type FilterParam <: Type
  }

  class P1 extends ScenarioParam
  class P2 extends ScenarioParam

  object someTarget extends ScenarioTarget {
    type FilterParam = Types[P1, Types[P2, Nil]]
  }

  class WhereClauseBuilder1[T <: ScenarioTarget] {
    type FilterBuilderType = T#FilterParam#Builder
    def m1(f: FilterBuilderType => Any): Any = null
    def m2(f: T#FilterParam#Builder => Any): Any = null
  }
  
  // triggers cyclic aliasing error on 2.13 only
  (null: WhereClauseBuilder1[someTarget.type]).m1(x => null)

  // triggers the cyclic aliasing error on 2.12 and 2.13
  // this corresponds to the desugaring of the above with a with PR #5999
  val stabilizer: WhereClauseBuilder1[someTarget.type] = null
  stabilizer.m1(x => null)
  
  // also triggers the cyclic aliasing error on 2.12 and 2.13
  (null: WhereClauseBuilder1[someTarget.type]).m2(x => null)

}
$ scalac  --scala-version 2.13.8 -d /tmp test/files/pos/stabilizer-cyclic.scala
test/files/pos/stabilizer-cyclic.scala:38: error: cyclic aliasing or subtyping involving type Builder
  (null: WhereClauseBuilder1[someTarget.type]).m1(x => null)
                                                  ^
test/files/pos/stabilizer-cyclic.scala:43: error: cyclic aliasing or subtyping involving type Builder
  stabilizer.m1(x => null)
                ^
test/files/pos/stabilizer-cyclic.scala:46: error: cyclic aliasing or subtyping involving type Builder
  (null: WhereClauseBuilder1[someTarget.type]).m2(x => null)
                                                  ^
3 errors

$ scalac  --scala-version 2.12.15 -d /tmp test/files/pos/stabilizer-cyclic.scala
test/files/pos/stabilizer-cyclic.scala:43: error: cyclic aliasing or subtyping involving type Builder
  stabilizer.m1(x => null)
                ^
test/files/pos/stabilizer-cyclic.scala:46: error: cyclic aliasing or subtyping involving type Builder
  (null: WhereClauseBuilder1[someTarget.type]).m2(x => null)
                                                  ^

The relevant change in 2.13 appears to be https://github.com/scala/scala/pull/5999 (stabilising vals)

scalac -Yrecursion 1 avoids all errors in both 2.12 and 2.13.

retronym avatar Jul 21 '22 06:07 retronym