Skip to content

Commit

Permalink
Merge pull request #1643 from dtolnay/chainedcompare
Browse files Browse the repository at this point in the history
Require parens for chained comparison binops
  • Loading branch information
dtolnay committed May 11, 2024
2 parents da509d5 + dc4ffde commit c79cea1
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/expr.rs
Expand Up @@ -1400,6 +1400,13 @@ pub(crate) mod parsing {
if precedence < base {
break;
}
if precedence == Precedence::Compare {
if let Expr::Binary(lhs) = &lhs {
if Precedence::of(&lhs.op) == Precedence::Compare {
break;
}
}
}
input.advance_to(&ahead);
let right = parse_binop_rhs(input, allow_struct, precedence)?;
lhs = Expr::Binary(ExprBinary {
Expand Down Expand Up @@ -1455,6 +1462,13 @@ pub(crate) mod parsing {
if precedence < base {
break;
}
if precedence == Precedence::Compare {
if let Expr::Binary(lhs) = &lhs {
if Precedence::of(&lhs.op) == Precedence::Compare {
break;
}
}
}
input.advance_to(&ahead);
let right = parse_binop_rhs(input, precedence)?;
lhs = Expr::Binary(ExprBinary {
Expand Down
32 changes: 32 additions & 0 deletions tests/test_expr.rs
Expand Up @@ -577,6 +577,38 @@ fn test_tuple_comma() {
"###);
}

#[test]
fn test_binop_associativity() {
// Left to right.
snapshot!("() + () + ()" as Expr, @r###"
Expr::Binary {
left: Expr::Binary {
left: Expr::Tuple,
op: BinOp::Add,
right: Expr::Tuple,
},
op: BinOp::Add,
right: Expr::Tuple,
}
"###);

// Right to left.
snapshot!("() += () += ()" as Expr, @r###"
Expr::Binary {
left: Expr::Tuple,
op: BinOp::AddAssign,
right: Expr::Binary {
left: Expr::Tuple,
op: BinOp::AddAssign,
right: Expr::Tuple,
},
}
"###);

// Parenthesization is required.
syn::parse_str::<Expr>("() == () == ()").unwrap_err();
}

#[test]
fn test_assign_range_precedence() {
// Range has higher precedence as the right-hand of an assignment, but
Expand Down

0 comments on commit c79cea1

Please sign in to comment.