@@ -4226,7 +4226,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
4226
4226
// local adaptation makes sure every adapted tree conforms to its pt
4227
4227
// so will take the code path that decides on inlining
4228
4228
val tree1 = adapt(tree, WildcardType , locked)
4229
- checkStatementPurity(tree1)(tree, ctx.owner)
4229
+ checkStatementPurity(tree1)(tree, ctx.owner, isUnitExpr = true )
4230
4230
if (! ctx.isAfterTyper && ! tree.isInstanceOf [Inlined ] && ctx.settings.WvalueDiscard .value && ! isThisTypeResult(tree)) {
4231
4231
report.warning(ValueDiscarding (tree.tpe), tree.srcPos)
4232
4232
}
@@ -4432,7 +4432,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
4432
4432
typedExpr(cmp, defn.BooleanType )
4433
4433
case _ =>
4434
4434
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 =
4436
4436
if ! tree.tpe.isErroneous
4437
4437
&& ! ctx.isAfterTyper
4438
4438
&& ! tree.isInstanceOf [Inlined ]
@@ -4450,6 +4450,8 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
4450
4450
// sometimes we do not have the original anymore and use the transformed tree instead.
4451
4451
// But taken together, the two criteria are quite accurate.
4452
4452
missingArgs(tree, tree.tpe.widen)
4453
+ case _ if isUnitExpr =>
4454
+ report.warning(PureUnitExpression (original, tree.tpe), original.srcPos)
4453
4455
case _ =>
4454
4456
report.warning(PureExpressionInStatementPosition (original, exprOwner), original.srcPos)
4455
4457
0 commit comments