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 {"x": 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;
|
||||
}
|
||||
|
||||
let Some(op) = EqCmpOp::try_from(*op) else {
|
||||
continue;
|
||||
};
|
||||
|
||||
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 {
|
||||
if let Some(op) = EqCmpOp::try_from(*op) {
|
||||
if checker.enabled(Rule::NoneComparison) && next.is_none_literal_expr() {
|
||||
match op {
|
||||
EqCmpOp::Eq => {
|
||||
let diagnostic =
|
||||
Diagnostic::new(TrueFalseComparison(*value, op), next.range());
|
||||
let diagnostic = Diagnostic::new(NoneComparison(op), next.range());
|
||||
bad_ops.insert(index, CmpOp::Is);
|
||||
diagnostics.push(diagnostic);
|
||||
}
|
||||
EqCmpOp::NotEq => {
|
||||
let diagnostic =
|
||||
Diagnostic::new(TrueFalseComparison(*value, op), next.range());
|
||||
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 {
|
||||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue