@@ -4226,7 +4226,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
42264226 // local adaptation makes sure every adapted tree conforms to its pt
42274227 // so will take the code path that decides on inlining
42284228 val tree1 = adapt(tree, WildcardType , locked)
4229- checkStatementPurity(tree1)(tree, ctx.owner)
4229+ checkStatementPurity(tree1)(tree, ctx.owner, isUnitExpr = true )
42304230 if (! ctx.isAfterTyper && ! tree.isInstanceOf [Inlined ] && ctx.settings.WvalueDiscard .value && ! isThisTypeResult(tree)) {
42314231 report.warning(ValueDiscarding (tree.tpe), tree.srcPos)
42324232 }
@@ -4432,7 +4432,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
44324432 typedExpr(cmp, defn.BooleanType )
44334433 case _ =>
44344434
4435- private def checkStatementPurity (tree : tpd.Tree )(original : untpd.Tree , exprOwner : Symbol )(using Context ): Unit =
4435+ private def checkStatementPurity (tree : tpd.Tree )(original : untpd.Tree , exprOwner : Symbol , isUnitExpr : Boolean = false )(using Context ): Unit =
44364436 if ! tree.tpe.isErroneous
44374437 && ! ctx.isAfterTyper
44384438 && ! tree.isInstanceOf [Inlined ]
@@ -4450,6 +4450,8 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
44504450 // sometimes we do not have the original anymore and use the transformed tree instead.
44514451 // But taken together, the two criteria are quite accurate.
44524452 missingArgs(tree, tree.tpe.widen)
4453+ case _ if isUnitExpr =>
4454+ report.warning(PureUnitExpression (original, tree.tpe), original.srcPos)
44534455 case _ =>
44544456 report.warning(PureExpressionInStatementPosition (original, exprOwner), original.srcPos)
44554457
0 commit comments