From 73f099ba506f6e877b676022a12cfdd31ab915b7 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Thu, 26 May 2016 12:06:56 +0200 Subject: Fix double evaluation of scrutinee with side-effects, add test --- .../tools/dotc/transform/IsInstanceOfEvaluator.scala | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'src/dotty') diff --git a/src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala b/src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala index 584628acd..6765604c8 100644 --- a/src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala +++ b/src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala @@ -91,16 +91,13 @@ class IsInstanceOfEvaluator extends MiniPhaseTransform { thisTransformer => * * `scrutinee.isInstanceOf[Selector]` if `scrutinee eq null` */ - def rewrite(tree: Select, to: Boolean): Tree = { - val expr = - if (!to || !tree.qualifier.tpe.widen.derivesFrom(defn.AnyRefAlias)) - Literal(Constant(to)) - else - Apply(tree.qualifier.select(defn.Object_ne), List(Literal(Constant(null)))) - - if (!isPureExpr(tree.qualifier)) Block(List(tree.qualifier), expr) - else expr - } + def rewrite(tree: Select, to: Boolean): Tree = + if (!to || !tree.qualifier.tpe.widen.derivesFrom(defn.AnyRefAlias)) { + val literal = Literal(Constant(to)) + if (!isPureExpr(tree.qualifier)) Block(List(tree.qualifier), literal) + else literal + } else + Apply(tree.qualifier.select(defn.Object_ne), List(Literal(Constant(null)))) /** Attempts to rewrite TypeApply to either `scrutinee ne null` or a * constant -- cgit v1.2.3