From a5878de9409c4d511c482a296ec6a3e85e868b93 Mon Sep 17 00:00:00 2001 From: Dmitry Petrashko Date: Fri, 24 Oct 2014 20:59:53 +0200 Subject: Fix pattern matcher double defining symbols used in type tests that are known to succeed. --- src/dotty/tools/dotc/transform/PatternMatcher.scala | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/dotty/tools/dotc/transform/PatternMatcher.scala') diff --git a/src/dotty/tools/dotc/transform/PatternMatcher.scala b/src/dotty/tools/dotc/transform/PatternMatcher.scala index ac92bb80c..4a1a66fbc 100644 --- a/src/dotty/tools/dotc/transform/PatternMatcher.scala +++ b/src/dotty/tools/dotc/transform/PatternMatcher.scala @@ -393,12 +393,14 @@ class PatternMatcher extends MiniPhaseTransform with DenotTransformer {thisTrans val res: Tree val nextBinder: Symbol - lazy val introducedRebindings = + lazy val introducedRebindings = /* if(nextBinder ne prevBinder) Rebindings(prevBinder, nextBinder) - else NoRebindings + else */ NoRebindings def chainBefore(next: Tree)(casegen: Casegen): Tree = - /*atPos(pos)(*/casegen.flatMapCond(cond, res, nextBinder, next)//) + if(prevBinder ne nextBinder) // happens when typeTest is known to succeed + /*atPos(pos)(*/casegen.flatMapCond(cond, res, nextBinder, next)//) + else casegen.flatMapGuard(cond, next) } // unless we're optimizing, emit local variable bindings for all subpatterns of extractor/case class patterns -- cgit v1.2.3