From: Tom Tromey Date: Mon, 12 Dec 2022 13:36:55 +0000 (-0700) Subject: Another Rust operator precedence bug X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=67a8c89601f6e1947484d5de23411634fef92e68;p=binutils-gdb.git Another Rust operator precedence bug My earlier patch to fix PR rust/29859 introduced a new operator precedence bug in the Rust parser. Assignment operators are right-associative in Rust. And, while this doesn't often matter, as Rust assignments always have the value (), still as a matter of principle we should get this correct. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29859 --- diff --git a/gdb/rust-parse.c b/gdb/rust-parse.c index 337927219d5..f28514ab2da 100644 --- a/gdb/rust-parse.c +++ b/gdb/rust-parse.c @@ -1344,6 +1344,8 @@ rust_parser::parse_binop (bool required) OPERATION (ANDAND, 2, logical_and_operation) \ OPERATION (OROR, 1, logical_or_operation) +#define ASSIGN_PREC 0 + operation_up start = parse_atom (required); if (start == nullptr) { @@ -1376,7 +1378,7 @@ rust_parser::parse_binop (bool required) compound_assign_op = current_opcode; /* FALLTHROUGH */ case '=': - precedence = 0; + precedence = ASSIGN_PREC; lex (); break; @@ -1398,7 +1400,11 @@ rust_parser::parse_binop (bool required) break; } - while (precedence <= operator_stack.back ().precedence + /* Make sure that assignments are right-associative while other + operations are left-associative. */ + while ((precedence == ASSIGN_PREC + ? precedence < operator_stack.back ().precedence + : precedence <= operator_stack.back ().precedence) && operator_stack.size () > 1) { rustop_item rhs = std::move (operator_stack.back ()); diff --git a/gdb/testsuite/gdb.rust/simple.exp b/gdb/testsuite/gdb.rust/simple.exp index 3a010f30ea6..0fb06af9380 100644 --- a/gdb/testsuite/gdb.rust/simple.exp +++ b/gdb/testsuite/gdb.rust/simple.exp @@ -416,3 +416,6 @@ if {[lindex $v 0] >= 8} { # The new parser introduced an operator precedence bug. gdb_test "print 5 * 7 / 5" " = 7" gdb_test "print 4 - 3 - 1" " = 0" + +# Another operator precedence bug. +gdb_test "print \$one = \$two = 75" " = \\\(\\\)"