@@ -2064,9 +2064,7 @@ class Typer extends Namer
20642064 traverse(stats ++ rest)
20652065 case stat :: rest =>
20662066 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)
20702068 buf += stat1
20712069 traverse(rest)
20722070 case nil =>
@@ -2607,10 +2605,13 @@ class Typer extends Namer
26072605 val folded = ConstFold (tree, pt)
26082606 if (folded ne tree) return adaptConstant(folded, folded.tpe.asInstanceOf [ConstantType ])
26092607 // drop type if prototype is Unit
2610- if (pt isRef defn.UnitClass )
2608+ if (pt isRef defn.UnitClass ) {
26112609 // local adaptation makes sure every adapted tree conforms to its pt
26122610 // 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+ }
26142615 // convert function literal to SAM closure
26152616 tree match {
26162617 case closure(Nil , id @ Ident (nme.ANON_FUN ), _)
@@ -2770,4 +2771,9 @@ class Typer extends Namer
27702771 case _ =>
27712772 }
27722773 }
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+ }
27732779}
0 commit comments