Skip to content

Commit

Permalink
Require parens for chained comparison binops
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed May 11, 2024
1 parent c463a74 commit dc4ffde
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 12 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
14 changes: 2 additions & 12 deletions tests/test_expr.rs
Expand Up @@ -605,18 +605,8 @@ fn test_binop_associativity() {
}
"###);

// FIXME: this should fail to parse. Parenthesization is required.
snapshot!("() == () == ()" as Expr, @r###"
Expr::Binary {
left: Expr::Binary {
left: Expr::Tuple,
op: BinOp::Eq,
right: Expr::Tuple,
},
op: BinOp::Eq,
right: Expr::Tuple,
}
"###);
// Parenthesization is required.
syn::parse_str::<Expr>("() == () == ()").unwrap_err();
}

#[test]
Expand Down

0 comments on commit dc4ffde

Please sign in to comment.