aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala
diff options
context:
space:
mode:
authorFelix Mulder <felix.mulder@gmail.com>2016-05-26 11:41:19 +0200
committerFelix Mulder <felix.mulder@gmail.com>2016-05-26 13:20:11 +0200
commitfa81e54db9ebb36c7f76cbedfa98115e50a8f88c (patch)
treecb03fa0ab0fbaa43a0e4199fd5c5efa3b9701e92 /src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala
parentfc419f55e29b7e77e9062d40a0864086f8d51bfa (diff)
downloaddotty-fa81e54db9ebb36c7f76cbedfa98115e50a8f88c.tar.gz
dotty-fa81e54db9ebb36c7f76cbedfa98115e50a8f88c.tar.bz2
dotty-fa81e54db9ebb36c7f76cbedfa98115e50a8f88c.zip
Take side-effects into account during rewriting
Diffstat (limited to 'src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala')
-rw-r--r--src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala b/src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala
index 14c3dea71..584628acd 100644
--- a/src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala
+++ b/src/dotty/tools/dotc/transform/IsInstanceOfEvaluator.scala
@@ -91,11 +91,16 @@ class IsInstanceOfEvaluator extends MiniPhaseTransform { thisTransformer =>
*
* `scrutinee.isInstanceOf[Selector]` if `scrutinee eq null`
*/
- def rewrite(tree: Select, to: Boolean): Tree =
- if (!to || !tree.qualifier.tpe.widen.derivesFrom(defn.AnyRefAlias))
- Literal(Constant(to))
- else
- Apply(tree.qualifier.select(defn.Object_ne), List(Literal(Constant(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
+ }
/** Attempts to rewrite TypeApply to either `scrutinee ne null` or a
* constant