From 042c2f07a3cbe7e5f80dea282849dc396bdc37e0 Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Mon, 30 Mar 2015 13:53:58 +0200 Subject: 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. --- src/dotty/tools/dotc/transform/PatternMatcher.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/dotty') 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 } } -- cgit v1.2.3