mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-02 06:41:23 +00:00
Avoid infinite loop in constant vs. None
comparisons (#9376)
## Summary We had an early `continue` in this loop, and we weren't setting `comparator = next;` when continuing... This PR removes the early continue altogether for clarity. Closes https://github.com/astral-sh/ruff/issues/9374. ## Test Plan `cargo test`
This commit is contained in:
parent
154d3b9f4b
commit
fd36754beb
2 changed files with 25 additions and 25 deletions
|
@ -51,3 +51,5 @@ if (True) == TrueElement or x == TrueElement:
|
||||||
assert (not foo) in bar
|
assert (not foo) in bar
|
||||||
assert {"x": not foo} in bar
|
assert {"x": not foo} in bar
|
||||||
assert [42, not foo] in bar
|
assert [42, not foo] in bar
|
||||||
|
|
||||||
|
assert x in c > 0 == None
|
||||||
|
|
|
@ -200,42 +200,40 @@ pub(crate) fn literal_comparisons(checker: &mut Checker, compare: &ast::ExprComp
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let Some(op) = EqCmpOp::try_from(*op) else {
|
if let Some(op) = EqCmpOp::try_from(*op) {
|
||||||
continue;
|
if checker.enabled(Rule::NoneComparison) && next.is_none_literal_expr() {
|
||||||
};
|
|
||||||
|
|
||||||
if checker.enabled(Rule::NoneComparison) && next.is_none_literal_expr() {
|
|
||||||
match op {
|
|
||||||
EqCmpOp::Eq => {
|
|
||||||
let diagnostic = Diagnostic::new(NoneComparison(op), next.range());
|
|
||||||
bad_ops.insert(index, CmpOp::Is);
|
|
||||||
diagnostics.push(diagnostic);
|
|
||||||
}
|
|
||||||
EqCmpOp::NotEq => {
|
|
||||||
let diagnostic = Diagnostic::new(NoneComparison(op), next.range());
|
|
||||||
bad_ops.insert(index, CmpOp::IsNot);
|
|
||||||
diagnostics.push(diagnostic);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if checker.enabled(Rule::TrueFalseComparison) {
|
|
||||||
if let Expr::BooleanLiteral(ast::ExprBooleanLiteral { value, .. }) = next {
|
|
||||||
match op {
|
match op {
|
||||||
EqCmpOp::Eq => {
|
EqCmpOp::Eq => {
|
||||||
let diagnostic =
|
let diagnostic = Diagnostic::new(NoneComparison(op), next.range());
|
||||||
Diagnostic::new(TrueFalseComparison(*value, op), next.range());
|
|
||||||
bad_ops.insert(index, CmpOp::Is);
|
bad_ops.insert(index, CmpOp::Is);
|
||||||
diagnostics.push(diagnostic);
|
diagnostics.push(diagnostic);
|
||||||
}
|
}
|
||||||
EqCmpOp::NotEq => {
|
EqCmpOp::NotEq => {
|
||||||
let diagnostic =
|
let diagnostic = Diagnostic::new(NoneComparison(op), next.range());
|
||||||
Diagnostic::new(TrueFalseComparison(*value, op), next.range());
|
|
||||||
bad_ops.insert(index, CmpOp::IsNot);
|
bad_ops.insert(index, CmpOp::IsNot);
|
||||||
diagnostics.push(diagnostic);
|
diagnostics.push(diagnostic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if checker.enabled(Rule::TrueFalseComparison) {
|
||||||
|
if let Expr::BooleanLiteral(ast::ExprBooleanLiteral { value, .. }) = next {
|
||||||
|
match op {
|
||||||
|
EqCmpOp::Eq => {
|
||||||
|
let diagnostic =
|
||||||
|
Diagnostic::new(TrueFalseComparison(*value, op), next.range());
|
||||||
|
bad_ops.insert(index, CmpOp::Is);
|
||||||
|
diagnostics.push(diagnostic);
|
||||||
|
}
|
||||||
|
EqCmpOp::NotEq => {
|
||||||
|
let diagnostic =
|
||||||
|
Diagnostic::new(TrueFalseComparison(*value, op), next.range());
|
||||||
|
bad_ops.insert(index, CmpOp::IsNot);
|
||||||
|
diagnostics.push(diagnostic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
comparator = next;
|
comparator = next;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue