From 46ea12a499aecd655a5c954431466db0a66e8ec9 Mon Sep 17 00:00:00 2001 From: nx2k3 Date: Sun, 26 Feb 2023 16:17:23 +0000 Subject: [PATCH 1/5] fix #108495, postfix decrement and prefix decrement has no warning --- .../rustc_parse/src/parser/diagnostics.rs | 29 ++++- compiler/rustc_parse/src/parser/expr.rs | 33 +++++- tests/ui/parser/issue-108495-dec.rs | 52 +++++++++ tests/ui/parser/issue-108495-dec.stderr | 107 ++++++++++++++++++ 4 files changed, 214 insertions(+), 7 deletions(-) create mode 100644 tests/ui/parser/issue-108495-dec.rs create mode 100644 tests/ui/parser/issue-108495-dec.stderr diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index d235b8a8176a8..e3dbe89b56c4e 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -166,7 +166,7 @@ enum IsStandalone { enum IncOrDec { Inc, // FIXME: `i--` recovery isn't implemented yet - #[allow(dead_code)] + // #[allow(dead_code)] Dec, } @@ -1331,7 +1331,7 @@ impl<'a> Parser<'a> { Ok(()) } - + #[allow(dead_code)] pub(super) fn recover_from_prefix_increment( &mut self, operand_expr: P, @@ -1342,7 +1342,7 @@ impl<'a> Parser<'a> { let kind = IncDecRecovery { standalone, op: IncOrDec::Inc, fixity: UnaryFixity::Pre }; self.recover_from_inc_dec(operand_expr, kind, op_span) } - + #[allow(dead_code)] pub(super) fn recover_from_postfix_increment( &mut self, operand_expr: P, @@ -1356,7 +1356,30 @@ impl<'a> Parser<'a> { }; self.recover_from_inc_dec(operand_expr, kind, op_span) } + pub(super) fn recover_from_prefix_decrement( + &mut self, + operand_expr: P, + op_span: Span, + start_stmt: bool, + ) -> PResult<'a, P> { + let standalone = if start_stmt { IsStandalone::Standalone } else { IsStandalone::Subexpr }; + let kind = IncDecRecovery { standalone, op: IncOrDec::Dec, fixity: UnaryFixity::Pre }; + self.recover_from_inc_dec(operand_expr, kind, op_span) + } + pub(super) fn recover_from_postfix_decrement( + &mut self, + operand_expr: P, + op_span: Span, + start_stmt: bool, + ) -> PResult<'a, P> { + let kind = IncDecRecovery { + standalone: if start_stmt { IsStandalone::Standalone } else { IsStandalone::Subexpr }, + op: IncOrDec::Dec, + fixity: UnaryFixity::Post, + }; + self.recover_from_inc_dec(operand_expr, kind, op_span) + } fn recover_from_inc_dec( &mut self, base: P, diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index 12f65a436e3be..2004d0a8fe7b6 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -281,6 +281,16 @@ impl<'a> Parser<'a> { lhs = self.recover_from_postfix_increment(lhs, op_span, starts_stmt)?; continue; } + if self.prev_token == token::BinOp(token::Minus) + && self.token == token::BinOp(token::Minus) + && self.prev_token.span.between(self.token.span).is_empty() + { + let op_span = self.prev_token.span.to(self.token.span); + // Eat the second `+` + self.bump(); + lhs = self.recover_from_postfix_decrement(lhs, op_span, starts_stmt)?; + continue; + } let op = op.node; // Special cases: @@ -550,10 +560,7 @@ impl<'a> Parser<'a> { token::Not => make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Not)), // `~expr` token::Tilde => make_it!(this, attrs, |this, _| this.recover_tilde_expr(lo)), - // `-expr` - token::BinOp(token::Minus) => { - make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Neg)) - } + // `*expr` token::BinOp(token::Star) => { make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Deref)) @@ -595,6 +602,24 @@ impl<'a> Parser<'a> { let operand_expr = this.parse_dot_or_call_expr(Default::default())?; this.recover_from_prefix_increment(operand_expr, pre_span, starts_stmt) } + // Recover from `++x`: + token::BinOp(token::Minus) + if this.look_ahead(1, |t| *t == token::BinOp(token::Minus)) => + { + let starts_stmt = this.prev_token == token::Semi + || this.prev_token == token::CloseDelim(Delimiter::Brace); + let pre_span = this.token.span.to(this.look_ahead(1, |t| t.span)); + // Eat both `+`s. + this.bump(); + this.bump(); + + let operand_expr = this.parse_dot_or_call_expr(Default::default())?; + this.recover_from_prefix_decrement(operand_expr, pre_span, starts_stmt) + } + // `-expr` + token::BinOp(token::Minus) => { + make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Neg)) + } token::Ident(..) if this.token.is_keyword(kw::Box) => { make_it!(this, attrs, |this, _| this.parse_box_expr(lo)) } diff --git a/tests/ui/parser/issue-108495-dec.rs b/tests/ui/parser/issue-108495-dec.rs new file mode 100644 index 0000000000000..165e6142b466c --- /dev/null +++ b/tests/ui/parser/issue-108495-dec.rs @@ -0,0 +1,52 @@ +fn test1() { + let mut i = 0; + let _ = i + --i; //~ ERROR Rust has no prefix decrement operator +} + +fn test2() { + let mut i = 0; + let _ = --i + i; //~ ERROR Rust has no prefix decrement operator +} + +fn test3() { + let mut i = 0; + let _ = --i + --i; //~ ERROR Rust has no prefix decrement operator +} + +fn test4() { + let mut i = 0; + let _ = i + i--; //~ ERROR Rust has no postfix decrement operator + // won't suggest since we can not handle the precedences +} + +fn test5() { + let mut i = 0; + let _ = i-- + i; //~ ERROR Rust has no postfix decrement operator +} + +fn test6() { + let mut i = 0; + let _ = i-- + i--; //~ ERROR Rust has no postfix decrement operator +} + +fn test7() { + let mut i = 0; + let _ = --i + i--; //~ ERROR Rust has no prefix decrement operator +} + +fn test8() { + let mut i = 0; + let _ = i-- + --i; //~ ERROR Rust has no postfix decrement operator +} + +fn test9() { + let mut i = 0; + let _ = (1 + 2 + i)--; //~ ERROR Rust has no postfix decrement operator +} + +fn test10() { + let mut i = 0; + let _ = (i-- + 1) + 2; //~ ERROR Rust has no postfix decrement operator +} + +fn main() { } diff --git a/tests/ui/parser/issue-108495-dec.stderr b/tests/ui/parser/issue-108495-dec.stderr new file mode 100644 index 0000000000000..078fec74c5545 --- /dev/null +++ b/tests/ui/parser/issue-108495-dec.stderr @@ -0,0 +1,107 @@ +error: Rust has no prefix decrement operator + --> $DIR/issue-dec.rs:3:17 + | +LL | let _ = i + --i; + | ^^ not a valid prefix operator + | +help: use `-= 1` instead + | +LL | let _ = i + { i -= 1; i }; + | ~ +++++++++ + +error: Rust has no prefix decrement operator + --> $DIR/issue-dec.rs:8:13 + | +LL | let _ = --i + i; + | ^^ not a valid prefix operator + | +help: use `-= 1` instead + | +LL | let _ = { i -= 1; i } + i; + | ~ +++++++++ + +error: Rust has no prefix decrement operator + --> $DIR/issue-dec.rs:13:13 + | +LL | let _ = --i + --i; + | ^^ not a valid prefix operator + | +help: use `-= 1` instead + | +LL | let _ = { i -= 1; i } + --i; + | ~ +++++++++ + +error: Rust has no postfix decrement operator + --> $DIR/issue-dec.rs:18:18 + | +LL | let _ = i + i--; + | ^^ not a valid postfix operator + +error: Rust has no postfix decrement operator + --> $DIR/issue-dec.rs:24:14 + | +LL | let _ = i-- + i; + | ^^ not a valid postfix operator + | +help: use `-= 1` instead + | +LL | let _ = { let tmp = i; i -= 1; tmp } + i; + | +++++++++++ ~~~~~~~~~~~~~~~ + +error: Rust has no postfix decrement operator + --> $DIR/issue-dec.rs:29:14 + | +LL | let _ = i-- + i--; + | ^^ not a valid postfix operator + | +help: use `-= 1` instead + | +LL | let _ = { let tmp = i; i -= 1; tmp } + i--; + | +++++++++++ ~~~~~~~~~~~~~~~ + +error: Rust has no prefix decrement operator + --> $DIR/issue-dec.rs:34:13 + | +LL | let _ = --i + i--; + | ^^ not a valid prefix operator + | +help: use `-= 1` instead + | +LL | let _ = { i -= 1; i } + i--; + | ~ +++++++++ + +error: Rust has no postfix decrement operator + --> $DIR/issue-dec.rs:39:14 + | +LL | let _ = i-- + --i; + | ^^ not a valid postfix operator + | +help: use `-= 1` instead + | +LL | let _ = { let tmp = i; i -= 1; tmp } + --i; + | +++++++++++ ~~~~~~~~~~~~~~~ + +error: Rust has no postfix decrement operator + --> $DIR/issue-dec.rs:44:24 + | +LL | let _ = (1 + 2 + i)--; + | ^^ not a valid postfix operator + | +help: use `-= 1` instead + | +LL | let _ = { let tmp = (1 + 2 + i); (1 + 2 + i) -= 1; tmp }; + | +++++++++++ ~~~~~~~~~~~~~~~~~~~~~~~~~ + +error: Rust has no postfix decrement operator + --> $DIR/issue-dec.rs:49:15 + | +LL | let _ = (i-- + 1) + 2; + | ^^ not a valid postfix operator + | +help: use `-= 1` instead + | +LL | let _ = ({ let tmp = i; i -= 1; tmp } + 1) + 2; + | +++++++++++ ~~~~~~~~~~~~~~~ + +error: aborting due to 10 previous errors + From 13a741afaccf03a4e98bedfc09e46c72e22810e0 Mon Sep 17 00:00:00 2001 From: nx2k3 Date: Sun, 26 Feb 2023 16:24:08 +0000 Subject: [PATCH 2/5] fix some comments --- compiler/rustc_parse/src/parser/diagnostics.rs | 6 ++---- compiler/rustc_parse/src/parser/expr.rs | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index e3dbe89b56c4e..134120532f87a 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -165,8 +165,6 @@ enum IsStandalone { #[derive(Debug, Copy, Clone, PartialEq, Eq)] enum IncOrDec { Inc, - // FIXME: `i--` recovery isn't implemented yet - // #[allow(dead_code)] Dec, } @@ -1331,7 +1329,7 @@ impl<'a> Parser<'a> { Ok(()) } - #[allow(dead_code)] + pub(super) fn recover_from_prefix_increment( &mut self, operand_expr: P, @@ -1342,7 +1340,7 @@ impl<'a> Parser<'a> { let kind = IncDecRecovery { standalone, op: IncOrDec::Inc, fixity: UnaryFixity::Pre }; self.recover_from_inc_dec(operand_expr, kind, op_span) } - #[allow(dead_code)] + pub(super) fn recover_from_postfix_increment( &mut self, operand_expr: P, diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index 2004d0a8fe7b6..a14f576eedce6 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -286,7 +286,7 @@ impl<'a> Parser<'a> { && self.prev_token.span.between(self.token.span).is_empty() { let op_span = self.prev_token.span.to(self.token.span); - // Eat the second `+` + // Eat the second `-` self.bump(); lhs = self.recover_from_postfix_decrement(lhs, op_span, starts_stmt)?; continue; @@ -602,14 +602,14 @@ impl<'a> Parser<'a> { let operand_expr = this.parse_dot_or_call_expr(Default::default())?; this.recover_from_prefix_increment(operand_expr, pre_span, starts_stmt) } - // Recover from `++x`: + // Recover from `--x`: token::BinOp(token::Minus) if this.look_ahead(1, |t| *t == token::BinOp(token::Minus)) => { let starts_stmt = this.prev_token == token::Semi || this.prev_token == token::CloseDelim(Delimiter::Brace); let pre_span = this.token.span.to(this.look_ahead(1, |t| t.span)); - // Eat both `+`s. + // Eat both `-`s. this.bump(); this.bump(); From 0883973d2a1a0346832e1d8556997f771c87e5d7 Mon Sep 17 00:00:00 2001 From: nx2k3 Date: Mon, 27 Feb 2023 13:25:03 +0000 Subject: [PATCH 3/5] check double negation --- compiler/rustc_parse/src/parser/expr.rs | 13 +++- tests/ui/parser/issue-108495-dec-pass.rs | 48 +++++++++++++++ tests/ui/parser/issue-108495-dec.rs | 35 ++++------- tests/ui/parser/issue-108495-dec.stderr | 78 ++++++------------------ 4 files changed, 90 insertions(+), 84 deletions(-) create mode 100644 tests/ui/parser/issue-108495-dec-pass.rs diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index a14f576eedce6..d1dc4ce1e9919 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -284,6 +284,7 @@ impl<'a> Parser<'a> { if self.prev_token == token::BinOp(token::Minus) && self.token == token::BinOp(token::Minus) && self.prev_token.span.between(self.token.span).is_empty() + && !self.look_ahead(1, |tok| tok.can_begin_expr()) { let op_span = self.prev_token.span.to(self.token.span); // Eat the second `-` @@ -560,7 +561,10 @@ impl<'a> Parser<'a> { token::Not => make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Not)), // `~expr` token::Tilde => make_it!(this, attrs, |this, _| this.recover_tilde_expr(lo)), - + // // `-expr` + // token::BinOp(token::Minus) => { + // make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Neg)) + // } // `*expr` token::BinOp(token::Star) => { make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Deref)) @@ -604,17 +608,20 @@ impl<'a> Parser<'a> { } // Recover from `--x`: token::BinOp(token::Minus) - if this.look_ahead(1, |t| *t == token::BinOp(token::Minus)) => + if this.look_ahead(1, |t| *t == token::BinOp(token::Minus)) + && !this.token.can_begin_expr() => { let starts_stmt = this.prev_token == token::Semi || this.prev_token == token::CloseDelim(Delimiter::Brace); let pre_span = this.token.span.to(this.look_ahead(1, |t| t.span)); + // if !this.token.can_begin_expr() { // Eat both `-`s. this.bump(); this.bump(); - let operand_expr = this.parse_dot_or_call_expr(Default::default())?; this.recover_from_prefix_decrement(operand_expr, pre_span, starts_stmt) + + // } } // `-expr` token::BinOp(token::Minus) => { diff --git a/tests/ui/parser/issue-108495-dec-pass.rs b/tests/ui/parser/issue-108495-dec-pass.rs new file mode 100644 index 0000000000000..2e17a317b685c --- /dev/null +++ b/tests/ui/parser/issue-108495-dec-pass.rs @@ -0,0 +1,48 @@ +// run-pass +fn test1() { + let i = 0; + let c = i + --i; + println!("{c}"); +} +fn test2() { + let i = 9; + let c = -- i + --i; + println!("{c}"); +} + +fn test3(){ + let i=10; + println!("{}",i--i); +} +fn test4(){ + let i=10; + println!("{}",--i); + +} +struct Foo { + bar: Bar, +} + +struct Bar { + qux: i32, +} + +fn test5() { + let foo = Foo { bar: Bar { qux: 0 } }; + let c=--foo.bar.qux; + println!("{c}"); +} + +fn test6(){ + let x=2; + let y=--x; + println!("{y}"); +} +fn main(){ + test1(); + test2(); + test3(); + test4(); + test5(); + test6(); +} diff --git a/tests/ui/parser/issue-108495-dec.rs b/tests/ui/parser/issue-108495-dec.rs index 165e6142b466c..db45577ec0189 100644 --- a/tests/ui/parser/issue-108495-dec.rs +++ b/tests/ui/parser/issue-108495-dec.rs @@ -1,18 +1,3 @@ -fn test1() { - let mut i = 0; - let _ = i + --i; //~ ERROR Rust has no prefix decrement operator -} - -fn test2() { - let mut i = 0; - let _ = --i + i; //~ ERROR Rust has no prefix decrement operator -} - -fn test3() { - let mut i = 0; - let _ = --i + --i; //~ ERROR Rust has no prefix decrement operator -} - fn test4() { let mut i = 0; let _ = i + i--; //~ ERROR Rust has no postfix decrement operator @@ -21,32 +6,36 @@ fn test4() { fn test5() { let mut i = 0; - let _ = i-- + i; //~ ERROR Rust has no postfix decrement operator + let _ = i-- + i--; //~ ERROR Rust has no postfix decrement operator } fn test6() { let mut i = 0; - let _ = i-- + i--; //~ ERROR Rust has no postfix decrement operator + let _ = --i + i--; //~ ERROR Rust has no postfix decrement operator } fn test7() { let mut i = 0; - let _ = --i + i--; //~ ERROR Rust has no prefix decrement operator + let _ = i-- + --i; //~ ERROR Rust has no postfix decrement operator } fn test8() { let mut i = 0; - let _ = i-- + --i; //~ ERROR Rust has no postfix decrement operator + let _ = (1 + 2 + i)--; //~ ERROR Rust has no postfix decrement operator } fn test9() { let mut i = 0; - let _ = (1 + 2 + i)--; //~ ERROR Rust has no postfix decrement operator + let _ = (i-- + 1) + 2; //~ ERROR Rust has no postfix decrement operator } -fn test10() { - let mut i = 0; - let _ = (i-- + 1) + 2; //~ ERROR Rust has no postfix decrement operator + + +fn test14(){ + let i=10; + while i!=0{ + i--; //~ ERROR Rust has no postfix decrement operator + } } fn main() { } diff --git a/tests/ui/parser/issue-108495-dec.stderr b/tests/ui/parser/issue-108495-dec.stderr index 078fec74c5545..90019e68f4460 100644 --- a/tests/ui/parser/issue-108495-dec.stderr +++ b/tests/ui/parser/issue-108495-dec.stderr @@ -1,55 +1,11 @@ -error: Rust has no prefix decrement operator - --> $DIR/issue-dec.rs:3:17 - | -LL | let _ = i + --i; - | ^^ not a valid prefix operator - | -help: use `-= 1` instead - | -LL | let _ = i + { i -= 1; i }; - | ~ +++++++++ - -error: Rust has no prefix decrement operator - --> $DIR/issue-dec.rs:8:13 - | -LL | let _ = --i + i; - | ^^ not a valid prefix operator - | -help: use `-= 1` instead - | -LL | let _ = { i -= 1; i } + i; - | ~ +++++++++ - -error: Rust has no prefix decrement operator - --> $DIR/issue-dec.rs:13:13 - | -LL | let _ = --i + --i; - | ^^ not a valid prefix operator - | -help: use `-= 1` instead - | -LL | let _ = { i -= 1; i } + --i; - | ~ +++++++++ - error: Rust has no postfix decrement operator - --> $DIR/issue-dec.rs:18:18 + --> $DIR/issue-108495-dec.rs:3:18 | LL | let _ = i + i--; | ^^ not a valid postfix operator error: Rust has no postfix decrement operator - --> $DIR/issue-dec.rs:24:14 - | -LL | let _ = i-- + i; - | ^^ not a valid postfix operator - | -help: use `-= 1` instead - | -LL | let _ = { let tmp = i; i -= 1; tmp } + i; - | +++++++++++ ~~~~~~~~~~~~~~~ - -error: Rust has no postfix decrement operator - --> $DIR/issue-dec.rs:29:14 + --> $DIR/issue-108495-dec.rs:9:14 | LL | let _ = i-- + i--; | ^^ not a valid postfix operator @@ -59,19 +15,14 @@ help: use `-= 1` instead LL | let _ = { let tmp = i; i -= 1; tmp } + i--; | +++++++++++ ~~~~~~~~~~~~~~~ -error: Rust has no prefix decrement operator - --> $DIR/issue-dec.rs:34:13 +error: Rust has no postfix decrement operator + --> $DIR/issue-108495-dec.rs:14:20 | LL | let _ = --i + i--; - | ^^ not a valid prefix operator - | -help: use `-= 1` instead - | -LL | let _ = { i -= 1; i } + i--; - | ~ +++++++++ + | ^^ not a valid postfix operator error: Rust has no postfix decrement operator - --> $DIR/issue-dec.rs:39:14 + --> $DIR/issue-108495-dec.rs:19:14 | LL | let _ = i-- + --i; | ^^ not a valid postfix operator @@ -82,7 +33,7 @@ LL | let _ = { let tmp = i; i -= 1; tmp } + --i; | +++++++++++ ~~~~~~~~~~~~~~~ error: Rust has no postfix decrement operator - --> $DIR/issue-dec.rs:44:24 + --> $DIR/issue-108495-dec.rs:24:24 | LL | let _ = (1 + 2 + i)--; | ^^ not a valid postfix operator @@ -93,7 +44,7 @@ LL | let _ = { let tmp = (1 + 2 + i); (1 + 2 + i) -= 1; tmp }; | +++++++++++ ~~~~~~~~~~~~~~~~~~~~~~~~~ error: Rust has no postfix decrement operator - --> $DIR/issue-dec.rs:49:15 + --> $DIR/issue-108495-dec.rs:29:15 | LL | let _ = (i-- + 1) + 2; | ^^ not a valid postfix operator @@ -103,5 +54,16 @@ help: use `-= 1` instead LL | let _ = ({ let tmp = i; i -= 1; tmp } + 1) + 2; | +++++++++++ ~~~~~~~~~~~~~~~ -error: aborting due to 10 previous errors +error: Rust has no postfix decrement operator + --> $DIR/issue-108495-dec.rs:37:10 + | +LL | i--; + | ^^ not a valid postfix operator + | +help: use `-= 1` instead + | +LL | i -= 1; + | ~~~~ + +error: aborting due to 7 previous errors From a4830266b01465462aab352008b2720ac60f2213 Mon Sep 17 00:00:00 2001 From: nx2k3 Date: Mon, 27 Feb 2023 16:54:38 +0000 Subject: [PATCH 4/5] handle only postfix decrement --- .../rustc_parse/src/parser/diagnostics.rs | 10 ---- compiler/rustc_parse/src/parser/expr.rs | 28 ++--------- tests/ui/parser/issue-108495-dec-pass.rs | 48 ------------------- 3 files changed, 4 insertions(+), 82 deletions(-) delete mode 100644 tests/ui/parser/issue-108495-dec-pass.rs diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index 134120532f87a..779fd90627bee 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -1354,16 +1354,6 @@ impl<'a> Parser<'a> { }; self.recover_from_inc_dec(operand_expr, kind, op_span) } - pub(super) fn recover_from_prefix_decrement( - &mut self, - operand_expr: P, - op_span: Span, - start_stmt: bool, - ) -> PResult<'a, P> { - let standalone = if start_stmt { IsStandalone::Standalone } else { IsStandalone::Subexpr }; - let kind = IncDecRecovery { standalone, op: IncOrDec::Dec, fixity: UnaryFixity::Pre }; - self.recover_from_inc_dec(operand_expr, kind, op_span) - } pub(super) fn recover_from_postfix_decrement( &mut self, diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index d1dc4ce1e9919..ec50388cb46f3 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -561,10 +561,10 @@ impl<'a> Parser<'a> { token::Not => make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Not)), // `~expr` token::Tilde => make_it!(this, attrs, |this, _| this.recover_tilde_expr(lo)), - // // `-expr` - // token::BinOp(token::Minus) => { - // make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Neg)) - // } + // `-expr` + token::BinOp(token::Minus) => { + make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Neg)) + } // `*expr` token::BinOp(token::Star) => { make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Deref)) @@ -606,27 +606,7 @@ impl<'a> Parser<'a> { let operand_expr = this.parse_dot_or_call_expr(Default::default())?; this.recover_from_prefix_increment(operand_expr, pre_span, starts_stmt) } - // Recover from `--x`: - token::BinOp(token::Minus) - if this.look_ahead(1, |t| *t == token::BinOp(token::Minus)) - && !this.token.can_begin_expr() => - { - let starts_stmt = this.prev_token == token::Semi - || this.prev_token == token::CloseDelim(Delimiter::Brace); - let pre_span = this.token.span.to(this.look_ahead(1, |t| t.span)); - // if !this.token.can_begin_expr() { - // Eat both `-`s. - this.bump(); - this.bump(); - let operand_expr = this.parse_dot_or_call_expr(Default::default())?; - this.recover_from_prefix_decrement(operand_expr, pre_span, starts_stmt) - // } - } - // `-expr` - token::BinOp(token::Minus) => { - make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Neg)) - } token::Ident(..) if this.token.is_keyword(kw::Box) => { make_it!(this, attrs, |this, _| this.parse_box_expr(lo)) } diff --git a/tests/ui/parser/issue-108495-dec-pass.rs b/tests/ui/parser/issue-108495-dec-pass.rs deleted file mode 100644 index 2e17a317b685c..0000000000000 --- a/tests/ui/parser/issue-108495-dec-pass.rs +++ /dev/null @@ -1,48 +0,0 @@ -// run-pass -fn test1() { - let i = 0; - let c = i + --i; - println!("{c}"); -} -fn test2() { - let i = 9; - let c = -- i + --i; - println!("{c}"); -} - -fn test3(){ - let i=10; - println!("{}",i--i); -} -fn test4(){ - let i=10; - println!("{}",--i); - -} -struct Foo { - bar: Bar, -} - -struct Bar { - qux: i32, -} - -fn test5() { - let foo = Foo { bar: Bar { qux: 0 } }; - let c=--foo.bar.qux; - println!("{c}"); -} - -fn test6(){ - let x=2; - let y=--x; - println!("{y}"); -} -fn main(){ - test1(); - test2(); - test3(); - test4(); - test5(); - test6(); -} From 031206bc1d16edcc963a1d0987ad37448a4cc019 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Tue, 28 Feb 2023 19:28:14 +0400 Subject: [PATCH 5/5] micro fmt changes --- .../rustc_parse/src/parser/diagnostics.rs | 1 + compiler/rustc_parse/src/parser/expr.rs | 2 +- tests/ui/parser/issue-108495-dec.rs | 20 +++++++++---------- tests/ui/parser/issue-108495-dec.stderr | 2 +- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index 779fd90627bee..78e4f3581b9e1 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -1368,6 +1368,7 @@ impl<'a> Parser<'a> { }; self.recover_from_inc_dec(operand_expr, kind, op_span) } + fn recover_from_inc_dec( &mut self, base: P, diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index ec50388cb46f3..828c268b58888 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -281,6 +281,7 @@ impl<'a> Parser<'a> { lhs = self.recover_from_postfix_increment(lhs, op_span, starts_stmt)?; continue; } + if self.prev_token == token::BinOp(token::Minus) && self.token == token::BinOp(token::Minus) && self.prev_token.span.between(self.token.span).is_empty() @@ -606,7 +607,6 @@ impl<'a> Parser<'a> { let operand_expr = this.parse_dot_or_call_expr(Default::default())?; this.recover_from_prefix_increment(operand_expr, pre_span, starts_stmt) } - token::Ident(..) if this.token.is_keyword(kw::Box) => { make_it!(this, attrs, |this, _| this.parse_box_expr(lo)) } diff --git a/tests/ui/parser/issue-108495-dec.rs b/tests/ui/parser/issue-108495-dec.rs index db45577ec0189..e0816f84e5c15 100644 --- a/tests/ui/parser/issue-108495-dec.rs +++ b/tests/ui/parser/issue-108495-dec.rs @@ -1,41 +1,39 @@ -fn test4() { +fn test0() { let mut i = 0; let _ = i + i--; //~ ERROR Rust has no postfix decrement operator // won't suggest since we can not handle the precedences } -fn test5() { +fn test1() { let mut i = 0; let _ = i-- + i--; //~ ERROR Rust has no postfix decrement operator } -fn test6() { +fn test2() { let mut i = 0; let _ = --i + i--; //~ ERROR Rust has no postfix decrement operator } -fn test7() { +fn test3() { let mut i = 0; let _ = i-- + --i; //~ ERROR Rust has no postfix decrement operator } -fn test8() { +fn test4() { let mut i = 0; let _ = (1 + 2 + i)--; //~ ERROR Rust has no postfix decrement operator } -fn test9() { +fn test5() { let mut i = 0; let _ = (i-- + 1) + 2; //~ ERROR Rust has no postfix decrement operator } - - -fn test14(){ +fn test6(){ let i=10; - while i!=0{ + while i != 0 { i--; //~ ERROR Rust has no postfix decrement operator } } -fn main() { } +fn main() {} diff --git a/tests/ui/parser/issue-108495-dec.stderr b/tests/ui/parser/issue-108495-dec.stderr index 90019e68f4460..85b29038f7c78 100644 --- a/tests/ui/parser/issue-108495-dec.stderr +++ b/tests/ui/parser/issue-108495-dec.stderr @@ -55,7 +55,7 @@ LL | let _ = ({ let tmp = i; i -= 1; tmp } + 1) + 2; | +++++++++++ ~~~~~~~~~~~~~~~ error: Rust has no postfix decrement operator - --> $DIR/issue-108495-dec.rs:37:10 + --> $DIR/issue-108495-dec.rs:35:10 | LL | i--; | ^^ not a valid postfix operator