diff options
author | Martin Odersky <odersky@gmail.com> | 2015-12-10 11:09:36 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-12-14 14:30:08 +0100 |
commit | 8203177068d02327e6c8ca576d2c704204500e27 (patch) | |
tree | c328b69b918b9784edbd01bcc1c546c567001bc4 /src/dotty/tools | |
parent | ac99941234da48427d1ca10823e45aa740baa354 (diff) | |
download | dotty-8203177068d02327e6c8ca576d2c704204500e27.tar.gz dotty-8203177068d02327e6c8ca576d2c704204500e27.tar.bz2 dotty-8203177068d02327e6c8ca576d2c704204500e27.zip |
Adaptations to checkSymAssign
(1) Also allow symbols to switch between a member of a class
and a member of its selftype. Seen in the wild in TraversableViewLike.scala.
Test case in pickling/selfSym.scala
(2) Tidy up the error message.
Diffstat (limited to 'src/dotty/tools')
-rw-r--r-- | src/dotty/tools/dotc/core/Types.scala | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala index 710d45e24..159e776b4 100644 --- a/src/dotty/tools/dotc/core/Types.scala +++ b/src/dotty/tools/dotc/core/Types.scala @@ -1387,7 +1387,7 @@ object Types { } private def checkSymAssign(sym: Symbol)(implicit ctx: Context) = { - def ownerSelfType = sym.owner.info match { + def selfTypeOf(sym: Symbol) = sym.owner.info match { case info: ClassInfo => info.givenSelfType case _ => NoType } @@ -1404,8 +1404,13 @@ object Types { (lastSymbol.infoOrCompleter == ErrorType || sym.owner != lastSymbol.owner && (sym.owner.derivesFrom(lastSymbol.owner) || - ownerSelfType.derivesFrom(lastSymbol.owner))), - s"data race? overwriting symbol of ${this.show} / $this / ${this.getClass} / ${lastSymbol.id} / ${sym.id} / ${lastSymbol.owner} / ${sym.owner} / ${ctx.phase} at run ${ctx.runId}") + selfTypeOf(sym).derivesFrom(lastSymbol.owner) || + selfTypeOf(lastSymbol).derivesFrom(sym.owner))), + s"""data race? overwriting symbol of type ${this.show}, + |long form = $this of class ${this.getClass}, + |last sym id = ${lastSymbol.id}, new sym id = ${sym.id}, + |last owner = ${lastSymbol.owner}, new owner = ${sym.owner}, + |period = ${ctx.phase} at run ${ctx.runId}""".stripMargin) } protected def sig: Signature = Signature.NotAMethod |