diff options
author | Martin Odersky <odersky@gmail.com> | 2016-12-02 16:48:11 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-12-02 16:48:19 +0100 |
commit | a7003bb223fb535f64a3026ff2a5a3e7d3ab7609 (patch) | |
tree | 7e64183a8d31a846e817628d5ea44abfc62a8730 /compiler/src/dotty/tools/dotc/core/Denotations.scala | |
parent | 131fcf26e65d45bea89989ced209f394457a6d12 (diff) | |
download | dotty-a7003bb223fb535f64a3026ff2a5a3e7d3ab7609.tar.gz dotty-a7003bb223fb535f64a3026ff2a5a3e7d3ab7609.tar.bz2 dotty-a7003bb223fb535f64a3026ff2a5a3e7d3ab7609.zip |
Fix insertAfter
Once the context-bounds desugaring of i1765.scala was fixed, another problem came up:
We hit an invalid denotation due to some interaction between mixin and memoize.
It turned out that `insertInsteadOf` did not do what its doc comment claimed: it did
not store a forwarding pointer `nextInRun` in the overwritten denotation. Once that
was fixed we also needed to fix a follow-on erorr that now we could have chains of
invalid denotations linked by `nextInRun`.
Diffstat (limited to 'compiler/src/dotty/tools/dotc/core/Denotations.scala')
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/Denotations.scala | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/Denotations.scala b/compiler/src/dotty/tools/dotc/core/Denotations.scala index 6a39c5787..99c688d50 100644 --- a/compiler/src/dotty/tools/dotc/core/Denotations.scala +++ b/compiler/src/dotty/tools/dotc/core/Denotations.scala @@ -132,7 +132,7 @@ object Denotations { def atSignature(sig: Signature, site: Type = NoPrefix, relaxed: Boolean = false)(implicit ctx: Context): Denotation /** The variant of this denotation that's current in the given context. - * If no such denotation exists, returns the denotation with each alternative + * If no such denotation exists, returns the denotation with each alternative * at its first point of definition. */ def current(implicit ctx: Context): Denotation @@ -744,6 +744,20 @@ object Denotations { else NoDenotation } + /** The next defined denotation (following `nextInRun`) or an arbitrary + * undefined denotation, if all denotations in a `nextinRun` cycle are + * undefined. + */ + private def nextDefined: SingleDenotation = { + var p1 = this + var p2 = nextInRun + while (p1.validFor == Nowhere && (p1 ne p2)) { + p1 = p1.nextInRun + p2 = p2.nextInRun.nextInRun + } + p1 + } + /** Produce a denotation that is valid for the given context. * Usually called when !(validFor contains ctx.period) * (even though this is not a precondition). @@ -763,8 +777,9 @@ object Denotations { // can happen if we sit on a stale denotation which has been replaced // wholesale by an installAfter; in this case, proceed to the next // denotation and try again. - if (validFor == Nowhere && nextInRun.validFor != Nowhere) return nextInRun.current - assert(false) + val nxt = nextDefined + if (nxt.validFor != Nowhere) return nxt + assert(false, this) } if (valid.runId != currentPeriod.runId) @@ -905,6 +920,7 @@ object Denotations { prev.nextInRun = this this.nextInRun = old.nextInRun old.validFor = Nowhere + old.nextInRun = this } def staleSymbolError(implicit ctx: Context) = { |