Skip to content

Commit

Permalink
Rollup merge of rust-lang#108496 - nx2k3:issue-108495-dec, r=WaffleLa…
Browse files Browse the repository at this point in the history
…pkin

fix rust-lang#108495, postfix decrement and prefix decrement has no warning

Fixes rust-lang#108495
  • Loading branch information
matthiaskrgr authored Mar 1, 2023
2 parents 32d7024 + 031206b commit 1c3cc8b
Show file tree
Hide file tree
Showing 4 changed files with 134 additions and 2 deletions.
16 changes: 14 additions & 2 deletions compiler/rustc_parse/src/parser/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}

Expand Down Expand Up @@ -1357,6 +1355,20 @@ impl<'a> Parser<'a> {
self.recover_from_inc_dec(operand_expr, kind, op_span)
}

pub(super) fn recover_from_postfix_decrement(
&mut self,
operand_expr: P<Expr>,
op_span: Span,
start_stmt: bool,
) -> PResult<'a, P<Expr>> {
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<Expr>,
Expand Down
12 changes: 12 additions & 0 deletions compiler/rustc_parse/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,18 @@ impl<'a> Parser<'a> {
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()
&& !self.look_ahead(1, |tok| tok.can_begin_expr())
{
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:
if op == AssocOp::As {
Expand Down
39 changes: 39 additions & 0 deletions tests/ui/parser/issue-108495-dec.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
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 test1() {
let mut i = 0;
let _ = i-- + i--; //~ ERROR Rust has no postfix decrement operator
}

fn test2() {
let mut i = 0;
let _ = --i + i--; //~ ERROR Rust has no postfix decrement operator
}

fn test3() {
let mut i = 0;
let _ = i-- + --i; //~ ERROR Rust has no postfix decrement operator
}

fn test4() {
let mut i = 0;
let _ = (1 + 2 + i)--; //~ ERROR Rust has no postfix decrement operator
}

fn test5() {
let mut i = 0;
let _ = (i-- + 1) + 2; //~ ERROR Rust has no postfix decrement operator
}

fn test6(){
let i=10;
while i != 0 {
i--; //~ ERROR Rust has no postfix decrement operator
}
}

fn main() {}
69 changes: 69 additions & 0 deletions tests/ui/parser/issue-108495-dec.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
error: Rust has no postfix decrement operator
--> $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-108495-dec.rs:9: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-108495-dec.rs:14:20
|
LL | let _ = --i + i--;
| ^^ not a valid postfix operator

error: Rust has no postfix decrement operator
--> $DIR/issue-108495-dec.rs:19: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-108495-dec.rs:24: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-108495-dec.rs:29: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: Rust has no postfix decrement operator
--> $DIR/issue-108495-dec.rs:35:10
|
LL | i--;
| ^^ not a valid postfix operator
|
help: use `-= 1` instead
|
LL | i -= 1;
| ~~~~

error: aborting due to 7 previous errors

0 comments on commit 1c3cc8b

Please sign in to comment.