diff --git a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala index c6a25bdd14e4..6420b40d08bf 100644 --- a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala +++ b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala @@ -178,7 +178,8 @@ abstract class LambdaLift extends InfoTransform { renamable += sym changedFreeVars = true debuglog(s"$sym is free in $enclosure") - if (sym.isVariable) sym setFlag CAPTURED + if (sym.isVariable && !sym.hasStableFlag) // write-once synthetic case vars are marked STABLE + sym setFlag CAPTURED } !enclosure.isClass } diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchOptimization.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchOptimization.scala index ba25b21820f3..2fc39ea7c271 100644 --- a/src/compiler/scala/tools/nsc/transform/patmat/MatchOptimization.scala +++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchOptimization.scala @@ -14,7 +14,7 @@ package scala.tools.nsc.transform.patmat import scala.language.postfixOps -import scala.tools.nsc.symtab.Flags.MUTABLE +import scala.tools.nsc.symtab.Flags.{MUTABLE, STABLE} import scala.collection.mutable import scala.reflect.internal.util.Position @@ -149,7 +149,7 @@ trait MatchOptimization extends MatchTreeMaking with MatchAnalysis { lazy val localSubstitution = Substitution(List(prevBinder), List(CODE.REF(nextBinder))) lazy val storedCond = freshSym(selectorPos, BooleanTpe, "rc") setFlag MUTABLE lazy val treesToHoist: List[Tree] = { - nextBinder setFlag MUTABLE + nextBinder setFlag MUTABLE | STABLE // mark stable to tell lambalift not to capture these as the value will be assigned prior to capture and never reassigned. nextBinder.setPos(selectorPos) List(storedCond, nextBinder) map (b => ValDef(b, codegen.mkZero(b.info))) } diff --git a/test/files/run/sd187.check b/test/files/run/sd187.check index f88fbc292333..2257aa0f0ccd 100644 --- a/test/files/run/sd187.check +++ b/test/files/run/sd187.check @@ -7,7 +7,7 @@ }; [107]def commonSubPattern([124]x: [127]): [107]AnyVal = [205]{ [205] var rc6: [205]Boolean = [205]false; - [205] var x3: [205]String = [205][205][205]null.asInstanceOf[[205]String]; + [205] var x3: [205]String = [205][205][205]null.asInstanceOf[[205]String]; [205]{ [205]case val x1: [205]Any = [205]x; [205]case8(){