diff options
author | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-07-13 17:39:46 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-07-13 17:39:46 +0200 |
commit | 61c30f8d949a43ad0580ef421c4fe94acc3c340e (patch) | |
tree | 038be0c8484b486c100b976e125993822e819047 /src | |
parent | 74c2e2326f6a68a889347ef3052d88a586aca84f (diff) | |
download | dotty-61c30f8d949a43ad0580ef421c4fe94acc3c340e.tar.gz dotty-61c30f8d949a43ad0580ef421c4fe94acc3c340e.tar.bz2 dotty-61c30f8d949a43ad0580ef421c4fe94acc3c340e.zip |
Relax Ycheck for labels after LabelDefs
LabelDefs reorders labels. As a result of reordering
label-def defined inside other label-def could be lifted outside.
LabelDefs doesn't update owner chains to represent this.
Making treeChecker aware of this.
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/tools/dotc/core/Phases.scala | 6 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/TreeChecker.scala | 3 |
2 files changed, 7 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/core/Phases.scala b/src/dotty/tools/dotc/core/Phases.scala index b086308a2..42b03484e 100644 --- a/src/dotty/tools/dotc/core/Phases.scala +++ b/src/dotty/tools/dotc/core/Phases.scala @@ -3,7 +3,7 @@ package core import Periods._ import Contexts._ -import dotty.tools.backend.jvm.GenBCode +import dotty.tools.backend.jvm.{LabelDefs, GenBCode} import util.DotClass import DenotTransformers._ import Denotations._ @@ -296,6 +296,8 @@ object Phases { private var myFlatClasses = false private var myRefChecked = false private var mySymbolicRefs = false + private var myLabelsReordered = false + /** The sequence position of this phase in the given context where 0 * is reserved for NoPhase and the first real phase is at position 1. @@ -311,6 +313,7 @@ object Phases { final def flatClasses = myFlatClasses // Phase is after flatten final def refChecked = myRefChecked // Phase is after RefChecks final def symbolicRefs = mySymbolicRefs // Phase is after ResolveSuper, newly generated TermRefs should be symbolic + final def labelsReordered = myLabelsReordered // Phase is after LabelDefs, labels are flattened and owner chains don't mirror this protected[Phases] def init(base: ContextBase, start: Int, end:Int): Unit = { if (start >= FirstPhaseId) @@ -321,6 +324,7 @@ object Phases { myFlatClasses = prev.getClass == classOf[Flatten] || prev.flatClasses myRefChecked = prev.getClass == classOf[RefChecks] || prev.refChecked mySymbolicRefs = prev.getClass == classOf[ResolveSuper] || prev.symbolicRefs + myLabelsReordered = prev.getClass == classOf[LabelDefs] || prev.labelsReordered } protected[Phases] def init(base: ContextBase, id: Int): Unit = init(base, id, id) diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala index 0e69b9d1f..b76f04b58 100644 --- a/src/dotty/tools/dotc/transform/TreeChecker.scala +++ b/src/dotty/tools/dotc/transform/TreeChecker.scala @@ -242,7 +242,8 @@ class TreeChecker extends Phase with SymTransformer { private def checkOwner(tree: untpd.Tree)(implicit ctx: Context): Unit = { def ownerMatches(symOwner: Symbol, ctxOwner: Symbol): Boolean = symOwner == ctxOwner || - ctxOwner.isWeakOwner && ownerMatches(symOwner, ctxOwner.owner) + ctxOwner.isWeakOwner && ownerMatches(symOwner, ctxOwner.owner) || + ctx.phase.labelsReordered && symOwner.isWeakOwner && ownerMatches(symOwner.owner, ctxOwner) assert(ownerMatches(tree.symbol.owner, ctx.owner), i"bad owner; ${tree.symbol} has owner ${tree.symbol.owner}, expected was ${ctx.owner}\n" + i"owner chain = ${tree.symbol.ownersIterator.toList}%, %, ctxOwners = ${ctx.outersIterator.map(_.owner).toList}%, %") |