aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-12-10 11:09:36 +0100
committerMartin Odersky <odersky@gmail.com>2015-12-14 14:30:08 +0100
commit8203177068d02327e6c8ca576d2c704204500e27 (patch)
treec328b69b918b9784edbd01bcc1c546c567001bc4 /src/dotty/tools
parentac99941234da48427d1ca10823e45aa740baa354 (diff)
downloaddotty-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.scala11
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