Skip to content

Commit 65e079e

Browse files
committed
op.c: don't warn about !!$x == $y
Exempt `!!` from the "Possible precedence problem between ! and <cmp>" warning. Fixes #22954.
1 parent d3f4b64 commit 65e079e

File tree

3 files changed

+47
-21
lines changed

3 files changed

+47
-21
lines changed

op.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12302,6 +12302,10 @@ check_precedence_not_vs_cmp(pTHX_ const OP *const o)
1230212302
&& right->op_type == OP_CONST
1230312303
&& SvIsBOOL(cSVOPx_sv(right))
1230412304
)
12305+
&& ( /* ... nor !!$x == ... */
12306+
(cUNOPx(left)->op_first->op_flags & OPf_PARENS)
12307+
|| cUNOPx(left)->op_first->op_type != OP_NOT
12308+
)
1230512309
) {
1230612310
Perl_ck_warner(aTHX_ packWARN(WARN_PRECEDENCE),
1230712311
"Possible precedence problem between ! and %s", OP_DESC(o)

pod/perldelta.pod

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,14 @@ XXX Changes (i.e. rewording) of diagnostic messages go here
230230

231231
=item *
232232

233+
L<Possible precedence problem between ! and %s|perldiag/"Possible precedence problem between ! and %s">
234+
235+
This warning no longer triggers for code like C<!!$x == $y>, i.e. where double
236+
negation (C<!!>) is used as a convert-to-boolean operator.
237+
[GH #22954]
238+
239+
=item *
240+
233241
XXX Describe change here
234242

235243
=back

t/lib/warnings/op

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,6 +1590,8 @@ for my $op (qw( == != < > <= >= eq ne lt gt le ge )) {
15901590
$code .= "\$a = !\$a $op \$b;\n"; # should warn
15911591
$code .= "\$a = (!\$a) $op \$b;\n";
15921592
$code .= "\$a = !(\$a) $op \$b;\n"; # should warn
1593+
$code .= "\$a = !!\$a $op \$b;\n";
1594+
$code .= "\$a = !(!\$a) $op \$b;\n"; # should warn
15931595
$code .= "\$a = !(\$a $op \$b);\n";
15941596
$code .= "\$a = !\$a $op !0;\n";
15951597
$code .= "\$a = !\$a $op !A_CONSTANT;\n";
@@ -1623,28 +1625,40 @@ Possible precedence problem between ! and derived class test at - line 6.
16231625
Possible precedence problem between ! and derived class test at - line 8.
16241626
Possible precedence problem between ! and numeric eq (==) at [cmp] line 1.
16251627
Possible precedence problem between ! and numeric eq (==) at [cmp] line 3.
1626-
Possible precedence problem between ! and numeric ne (!=) at [cmp] line 8.
1628+
Possible precedence problem between ! and numeric eq (==) at [cmp] line 5.
16271629
Possible precedence problem between ! and numeric ne (!=) at [cmp] line 10.
1628-
Possible precedence problem between ! and numeric lt (<) at [cmp] line 15.
1629-
Possible precedence problem between ! and numeric lt (<) at [cmp] line 17.
1630-
Possible precedence problem between ! and numeric gt (>) at [cmp] line 22.
1631-
Possible precedence problem between ! and numeric gt (>) at [cmp] line 24.
1632-
Possible precedence problem between ! and numeric le (<=) at [cmp] line 29.
1633-
Possible precedence problem between ! and numeric le (<=) at [cmp] line 31.
1634-
Possible precedence problem between ! and numeric ge (>=) at [cmp] line 36.
1635-
Possible precedence problem between ! and numeric ge (>=) at [cmp] line 38.
1636-
Possible precedence problem between ! and string eq at [cmp] line 43.
1637-
Possible precedence problem between ! and string eq at [cmp] line 45.
1638-
Possible precedence problem between ! and string ne at [cmp] line 50.
1639-
Possible precedence problem between ! and string ne at [cmp] line 52.
1640-
Possible precedence problem between ! and string lt at [cmp] line 57.
1641-
Possible precedence problem between ! and string lt at [cmp] line 59.
1642-
Possible precedence problem between ! and string gt at [cmp] line 64.
1643-
Possible precedence problem between ! and string gt at [cmp] line 66.
1644-
Possible precedence problem between ! and string le at [cmp] line 71.
1645-
Possible precedence problem between ! and string le at [cmp] line 73.
1646-
Possible precedence problem between ! and string ge at [cmp] line 78.
1647-
Possible precedence problem between ! and string ge at [cmp] line 80.
1630+
Possible precedence problem between ! and numeric ne (!=) at [cmp] line 12.
1631+
Possible precedence problem between ! and numeric ne (!=) at [cmp] line 14.
1632+
Possible precedence problem between ! and numeric lt (<) at [cmp] line 19.
1633+
Possible precedence problem between ! and numeric lt (<) at [cmp] line 21.
1634+
Possible precedence problem between ! and numeric lt (<) at [cmp] line 23.
1635+
Possible precedence problem between ! and numeric gt (>) at [cmp] line 28.
1636+
Possible precedence problem between ! and numeric gt (>) at [cmp] line 30.
1637+
Possible precedence problem between ! and numeric gt (>) at [cmp] line 32.
1638+
Possible precedence problem between ! and numeric le (<=) at [cmp] line 37.
1639+
Possible precedence problem between ! and numeric le (<=) at [cmp] line 39.
1640+
Possible precedence problem between ! and numeric le (<=) at [cmp] line 41.
1641+
Possible precedence problem between ! and numeric ge (>=) at [cmp] line 46.
1642+
Possible precedence problem between ! and numeric ge (>=) at [cmp] line 48.
1643+
Possible precedence problem between ! and numeric ge (>=) at [cmp] line 50.
1644+
Possible precedence problem between ! and string eq at [cmp] line 55.
1645+
Possible precedence problem between ! and string eq at [cmp] line 57.
1646+
Possible precedence problem between ! and string eq at [cmp] line 59.
1647+
Possible precedence problem between ! and string ne at [cmp] line 64.
1648+
Possible precedence problem between ! and string ne at [cmp] line 66.
1649+
Possible precedence problem between ! and string ne at [cmp] line 68.
1650+
Possible precedence problem between ! and string lt at [cmp] line 73.
1651+
Possible precedence problem between ! and string lt at [cmp] line 75.
1652+
Possible precedence problem between ! and string lt at [cmp] line 77.
1653+
Possible precedence problem between ! and string gt at [cmp] line 82.
1654+
Possible precedence problem between ! and string gt at [cmp] line 84.
1655+
Possible precedence problem between ! and string gt at [cmp] line 86.
1656+
Possible precedence problem between ! and string le at [cmp] line 91.
1657+
Possible precedence problem between ! and string le at [cmp] line 93.
1658+
Possible precedence problem between ! and string le at [cmp] line 95.
1659+
Possible precedence problem between ! and string ge at [cmp] line 100.
1660+
Possible precedence problem between ! and string ge at [cmp] line 102.
1661+
Possible precedence problem between ! and string ge at [cmp] line 104.
16481662
Possible precedence problem between ! and pattern match (m//) at [bind] line 1.
16491663
Possible precedence problem between ! and pattern match (m//) at [bind] line 3.
16501664
Possible precedence problem between ! and pattern match (m//) at [bind] line 6.

0 commit comments

Comments
 (0)