Skip to content

Commit 1c3cc8b

Browse files
authored
Rollup merge of rust-lang#108496 - nx2k3:issue-108495-dec, r=WaffleLapkin
fix rust-lang#108495, postfix decrement and prefix decrement has no warning Fixes rust-lang#108495
2 parents 32d7024 + 031206b commit 1c3cc8b

File tree

4 files changed

+134
-2
lines changed

4 files changed

+134
-2
lines changed

compiler/rustc_parse/src/parser/diagnostics.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,6 @@ enum IsStandalone {
165165
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
166166
enum IncOrDec {
167167
Inc,
168-
// FIXME: `i--` recovery isn't implemented yet
169-
#[allow(dead_code)]
170168
Dec,
171169
}
172170

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

1358+
pub(super) fn recover_from_postfix_decrement(
1359+
&mut self,
1360+
operand_expr: P<Expr>,
1361+
op_span: Span,
1362+
start_stmt: bool,
1363+
) -> PResult<'a, P<Expr>> {
1364+
let kind = IncDecRecovery {
1365+
standalone: if start_stmt { IsStandalone::Standalone } else { IsStandalone::Subexpr },
1366+
op: IncOrDec::Dec,
1367+
fixity: UnaryFixity::Post,
1368+
};
1369+
self.recover_from_inc_dec(operand_expr, kind, op_span)
1370+
}
1371+
13601372
fn recover_from_inc_dec(
13611373
&mut self,
13621374
base: P<Expr>,

compiler/rustc_parse/src/parser/expr.rs

+12
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,18 @@ impl<'a> Parser<'a> {
282282
continue;
283283
}
284284

285+
if self.prev_token == token::BinOp(token::Minus)
286+
&& self.token == token::BinOp(token::Minus)
287+
&& self.prev_token.span.between(self.token.span).is_empty()
288+
&& !self.look_ahead(1, |tok| tok.can_begin_expr())
289+
{
290+
let op_span = self.prev_token.span.to(self.token.span);
291+
// Eat the second `-`
292+
self.bump();
293+
lhs = self.recover_from_postfix_decrement(lhs, op_span, starts_stmt)?;
294+
continue;
295+
}
296+
285297
let op = op.node;
286298
// Special cases:
287299
if op == AssocOp::As {

tests/ui/parser/issue-108495-dec.rs

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
fn test0() {
2+
let mut i = 0;
3+
let _ = i + i--; //~ ERROR Rust has no postfix decrement operator
4+
// won't suggest since we can not handle the precedences
5+
}
6+
7+
fn test1() {
8+
let mut i = 0;
9+
let _ = i-- + i--; //~ ERROR Rust has no postfix decrement operator
10+
}
11+
12+
fn test2() {
13+
let mut i = 0;
14+
let _ = --i + i--; //~ ERROR Rust has no postfix decrement operator
15+
}
16+
17+
fn test3() {
18+
let mut i = 0;
19+
let _ = i-- + --i; //~ ERROR Rust has no postfix decrement operator
20+
}
21+
22+
fn test4() {
23+
let mut i = 0;
24+
let _ = (1 + 2 + i)--; //~ ERROR Rust has no postfix decrement operator
25+
}
26+
27+
fn test5() {
28+
let mut i = 0;
29+
let _ = (i-- + 1) + 2; //~ ERROR Rust has no postfix decrement operator
30+
}
31+
32+
fn test6(){
33+
let i=10;
34+
while i != 0 {
35+
i--; //~ ERROR Rust has no postfix decrement operator
36+
}
37+
}
38+
39+
fn main() {}
+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
error: Rust has no postfix decrement operator
2+
--> $DIR/issue-108495-dec.rs:3:18
3+
|
4+
LL | let _ = i + i--;
5+
| ^^ not a valid postfix operator
6+
7+
error: Rust has no postfix decrement operator
8+
--> $DIR/issue-108495-dec.rs:9:14
9+
|
10+
LL | let _ = i-- + i--;
11+
| ^^ not a valid postfix operator
12+
|
13+
help: use `-= 1` instead
14+
|
15+
LL | let _ = { let tmp = i; i -= 1; tmp } + i--;
16+
| +++++++++++ ~~~~~~~~~~~~~~~
17+
18+
error: Rust has no postfix decrement operator
19+
--> $DIR/issue-108495-dec.rs:14:20
20+
|
21+
LL | let _ = --i + i--;
22+
| ^^ not a valid postfix operator
23+
24+
error: Rust has no postfix decrement operator
25+
--> $DIR/issue-108495-dec.rs:19:14
26+
|
27+
LL | let _ = i-- + --i;
28+
| ^^ not a valid postfix operator
29+
|
30+
help: use `-= 1` instead
31+
|
32+
LL | let _ = { let tmp = i; i -= 1; tmp } + --i;
33+
| +++++++++++ ~~~~~~~~~~~~~~~
34+
35+
error: Rust has no postfix decrement operator
36+
--> $DIR/issue-108495-dec.rs:24:24
37+
|
38+
LL | let _ = (1 + 2 + i)--;
39+
| ^^ not a valid postfix operator
40+
|
41+
help: use `-= 1` instead
42+
|
43+
LL | let _ = { let tmp = (1 + 2 + i); (1 + 2 + i) -= 1; tmp };
44+
| +++++++++++ ~~~~~~~~~~~~~~~~~~~~~~~~~
45+
46+
error: Rust has no postfix decrement operator
47+
--> $DIR/issue-108495-dec.rs:29:15
48+
|
49+
LL | let _ = (i-- + 1) + 2;
50+
| ^^ not a valid postfix operator
51+
|
52+
help: use `-= 1` instead
53+
|
54+
LL | let _ = ({ let tmp = i; i -= 1; tmp } + 1) + 2;
55+
| +++++++++++ ~~~~~~~~~~~~~~~
56+
57+
error: Rust has no postfix decrement operator
58+
--> $DIR/issue-108495-dec.rs:35:10
59+
|
60+
LL | i--;
61+
| ^^ not a valid postfix operator
62+
|
63+
help: use `-= 1` instead
64+
|
65+
LL | i -= 1;
66+
| ~~~~
67+
68+
error: aborting due to 7 previous errors
69+

0 commit comments

Comments
 (0)