@@ -2064,9 +2064,7 @@ class Typer extends Namer
2064
2064
traverse(stats ++ rest)
2065
2065
case stat :: rest =>
2066
2066
val stat1 = typed(stat)(ctx.exprContext(stat, exprOwner))
2067
- if (! ctx.isAfterTyper && isPureExpr(stat1) &&
2068
- ! stat1.tpe.isRef(defn.UnitClass ) && ! isSelfOrSuperConstrCall(stat1))
2069
- ctx.warning(PureExpressionInStatementPosition (stat, exprOwner), stat.pos)
2067
+ checkStatementPurity(stat1)(stat, exprOwner)
2070
2068
buf += stat1
2071
2069
traverse(rest)
2072
2070
case nil =>
@@ -2607,10 +2605,13 @@ class Typer extends Namer
2607
2605
val folded = ConstFold (tree, pt)
2608
2606
if (folded ne tree) return adaptConstant(folded, folded.tpe.asInstanceOf [ConstantType ])
2609
2607
// drop type if prototype is Unit
2610
- if (pt isRef defn.UnitClass )
2608
+ if (pt isRef defn.UnitClass ) {
2611
2609
// local adaptation makes sure every adapted tree conforms to its pt
2612
2610
// so will take the code path that decides on inlining
2613
- return tpd.Block (adapt(tree, WildcardType , locked) :: Nil , Literal (Constant (())))
2611
+ val tree1 = adapt(tree, WildcardType , locked)
2612
+ checkStatementPurity(tree1)(tree, ctx.owner)
2613
+ return tpd.Block (tree1 :: Nil , Literal (Constant (())))
2614
+ }
2614
2615
// convert function literal to SAM closure
2615
2616
tree match {
2616
2617
case closure(Nil , id @ Ident (nme.ANON_FUN ), _)
@@ -2770,4 +2771,9 @@ class Typer extends Namer
2770
2771
case _ =>
2771
2772
}
2772
2773
}
2774
+
2775
+ private def checkStatementPurity (tree : tpd.Tree )(original : untpd.Tree , exprOwner : Symbol )(implicit ctx : Context ): Unit = {
2776
+ if (! ctx.isAfterTyper && isPureExpr(tree) && ! tree.tpe.isRef(defn.UnitClass ) && ! isSelfOrSuperConstrCall(tree))
2777
+ ctx.warning(PureExpressionInStatementPosition (original, exprOwner), original.pos)
2778
+ }
2773
2779
}
0 commit comments