diff options
author | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-30 13:53:58 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-30 13:53:58 +0200 |
commit | 042c2f07a3cbe7e5f80dea282849dc396bdc37e0 (patch) | |
tree | 72145cc96bbb987025eb3f5b38e6d6c95a216548 /src/dotty/tools/dotc/transform/PatternMatcher.scala | |
parent | cdbe81e95cbf5e67fe4289b450440b63147f68ab (diff) | |
download | dotty-042c2f07a3cbe7e5f80dea282849dc396bdc37e0.tar.gz dotty-042c2f07a3cbe7e5f80dea282849dc396bdc37e0.tar.bz2 dotty-042c2f07a3cbe7e5f80dea282849dc396bdc37e0.zip |
Fix #442.
There's a non-standard interaction between explicitOuter and Pattern matcher,
as patmat can request outer symbols to be available earlier.
Note that this fix makes code between pattern matcher & explicitOuter non-Ycheck-able,
as patmat adds reference to future symbol.
Diffstat (limited to 'src/dotty/tools/dotc/transform/PatternMatcher.scala')
-rw-r--r-- | src/dotty/tools/dotc/transform/PatternMatcher.scala | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/transform/PatternMatcher.scala b/src/dotty/tools/dotc/transform/PatternMatcher.scala index ea41e7592..1f1552398 100644 --- a/src/dotty/tools/dotc/transform/PatternMatcher.scala +++ b/src/dotty/tools/dotc/transform/PatternMatcher.scala @@ -643,8 +643,12 @@ class PatternMatcher extends MiniPhaseTransform with DenotTransformer {thisTrans // val outer = expectedTp.typeSymbol.newMethod(vpmName.outer, newFlags = SYNTHETIC | ARTIFACT) setInfo expectedTp.prefix val expectedClass = expectedTp.dealias.classSymbol.asClass - ExplicitOuter.ensureOuterAccessors(expectedClass) - codegen._asInstanceOf(testedBinder, expectedTp).select(ExplicitOuter.outerAccessor(expectedClass)).select(defn.Object_eq).appliedTo(expectedOuter) + val test = codegen._asInstanceOf(testedBinder, expectedTp) + val outerAccessorTested = ctx.atPhase(ctx.explicitOuterPhase.next) { implicit ctx => + ExplicitOuter.ensureOuterAccessors(expectedClass) + test.select(ExplicitOuter.outerAccessor(expectedClass)).select(defn.Object_eq).appliedTo(expectedOuter) + } + outerAccessorTested } } |