1
Fork 0

Change comparison operators to have Fixity::None

This commit is contained in:
David Tolnay 2024-12-20 19:50:42 -08:00
parent d748d1d953
commit fe65e886f3
No known key found for this signature in database
GPG key ID: F9BA143B95FF6D82
3 changed files with 8 additions and 17 deletions

View file

@ -153,9 +153,10 @@ impl AssocOp {
match *self { match *self {
Assign | AssignOp(_) => Fixity::Right, Assign | AssignOp(_) => Fixity::Right,
As | Multiply | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd As | Multiply | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd
| BitXor | BitOr | Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | BitXor | BitOr | LAnd | LOr => Fixity::Left,
| LAnd | LOr => Fixity::Left, Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | DotDot | DotDotEq => {
DotDot | DotDotEq => Fixity::None, Fixity::None
}
} }
} }

View file

@ -279,13 +279,9 @@ impl<'a> Parser<'a> {
break; break;
} }
let fixity = op.fixity(); let min_prec = match op.fixity() {
let min_prec = match fixity {
Fixity::Right => Bound::Included(prec), Fixity::Right => Bound::Included(prec),
Fixity::Left => Bound::Excluded(prec), Fixity::Left | Fixity::None => Bound::Excluded(prec),
// We currently have no non-associative operators that are not handled above by
// the special cases. The code is here only for future convenience.
Fixity::None => Bound::Excluded(prec),
}; };
let (rhs, _) = self.with_res(restrictions - Restrictions::STMT_EXPR, |this| { let (rhs, _) = self.with_res(restrictions - Restrictions::STMT_EXPR, |this| {
let attrs = this.parse_outer_attributes()?; let attrs = this.parse_outer_attributes()?;
@ -337,10 +333,6 @@ impl<'a> Parser<'a> {
self.dcx().span_bug(span, "AssocOp should have been handled by special case") self.dcx().span_bug(span, "AssocOp should have been handled by special case")
} }
}; };
if let Fixity::None = fixity {
break;
}
} }
Ok((lhs, parsed_something)) Ok((lhs, parsed_something))

View file

@ -97,6 +97,8 @@ static EXPRS: &[&str] = &[
"2..(2..2)", "2..(2..2)",
"(2..2)..", "(2..2)..",
"..(2..2)", "..(2..2)",
// Grammar restriction: comparison operators cannot be chained (1 < 2 == false).
"((1 < 2) == false) as usize",
// Grammar restriction: the value in let-else is not allowed to end in a // Grammar restriction: the value in let-else is not allowed to end in a
// curly brace. // curly brace.
"{ let _ = 1 + 1 else {}; }", "{ let _ = 1 + 1 else {}; }",
@ -121,10 +123,6 @@ static EXPRS: &[&str] = &[
"if let _ = () && (Struct {}).x {}", "if let _ = () && (Struct {}).x {}",
*/ */
/* /*
// FIXME: pretty-printer produces invalid syntax. `(1 < 2 == false) as usize`
"((1 < 2) == false) as usize",
*/
/*
// FIXME: pretty-printer produces invalid syntax. `for _ in 1..{ 2 } {}` // FIXME: pretty-printer produces invalid syntax. `for _ in 1..{ 2 } {}`
"for _ in (1..{ 2 }) {}", "for _ in (1..{ 2 }) {}",
*/ */