bug
bug copied to clipboard
new "cyclic aliasing or subtype" error in 2.13
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.