Fix overflowing_literals lint with repeated negation#158302
Conversation
This better matches how the argument is actually used.
See `rustc_hir::intravisit::{walk_expr,walk_pat_expr}`.
|
cc @rust-lang/clippy |
|
r? @adwinwhite rustbot has assigned @adwinwhite. Use Why was this reviewer chosen?The reviewer was selected based on:
|
|
I personally lean towards catching more overflows at compile-time if possible, and we can clarify this in reference instead? Of course we should hear more opinions. Is starting FCP the right process for that? |
|
If the I've just noticed that the In any case, I'm lang-nominating for opinions on when exactly these two lints should fire. |
|
I figured out that the Hopefully it should be obvious from the tests now, that the same amount of overflows are still caught by lints. |
|
Another thing I forgot to mention previously: The run time behavior of an |
Fixes rust-lang#158295 The `overflowing_literal` lint is, I believe, supposed to consider the literal and not the surrounding context when deciding whether to lint. This is in contrast to the `arithmetic_overflow` lint, which only considers code that executes at run time, which excludes the negation inside a literal. According to [the reference](https://doc.rust-lang.org/1.96.0/reference/expressions/operator-expr.html#r-expr.operator.int-overflow.unary-neg), a negation in front of an integer does not result in an overflow. I think of this as: a negation, and only one negation, in front of an integer, is "part of" the integer. Therefore, the `overflowing_literal` lint should consider that when linting. It should not consider the second or third negation. Therefore, this commit changes `overflowing_literals` so that it only lints on `128_i8` when there is no preceding negation at all. This is in contrast to the previous behavior, which lints on `128_i8` preceded by an even number of negations.
Fixes #158295
This PR consists of: two commits with non-functional cleanups, a commit that adds a test, and a commit that actually changes the behavior. The following description concerns the changed behavior. See the test changed in the fourth commit for code demonstrating the change in behavior.
The
overflowing_literallint is, I believe, supposed to consider the literal and not the surrounding context when deciding whether to lint. This is in contrast to thearithmetic_overflowlint, which only considers code that executes at run time, which excludes the negation inside a literal.According to the reference, a negation in front of an integer does not result in an overflow. I think of this as: a negation, and only one negation, in front of an integer, is "part of" the integer. Therefore, the
overflowing_literallint should consider that when linting. It should not consider the second or third negation.Therefore, this PR changes
overflowing_literalsso that it only lints on128_i8when there is no preceding negation at all. This is in contrast to the previous behavior, which lints on128_i8preceded by an even number of negations.