Skip to content

Commit 300aa90

Browse files
committed
Auto merge of #105701 - RedDocMD:bug-105634, r=cjgillot
Allow .. to be parsed as let initializer .. and ..= are valid expressions, however when used in a let statement it is not parsed. Fixes #105634
2 parents d9ee0f4 + 4af9e6a commit 300aa90

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

compiler/rustc_ast/src/token.rs

+4
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,10 @@ impl Token {
379379
}
380380
}
381381

382+
pub fn is_range_separator(&self) -> bool {
383+
[DotDot, DotDotDot, DotDotEq].contains(&self.kind)
384+
}
385+
382386
pub fn is_op(&self) -> bool {
383387
match self.kind {
384388
Eq | Lt | Le | EqEq | Ne | Ge | Gt | AndAnd | OrOr | Not | Tilde | BinOp(_)

compiler/rustc_parse/src/parser/expr.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ impl<'a> Parser<'a> {
182182
LhsExpr::AttributesParsed(attrs) => Some(attrs),
183183
_ => None,
184184
};
185-
if [token::DotDot, token::DotDotDot, token::DotDotEq].contains(&self.token.kind) {
185+
if self.token.is_range_separator() {
186186
return self.parse_prefix_range_expr(attrs);
187187
} else {
188188
self.parse_prefix_expr(attrs)?
@@ -514,7 +514,7 @@ impl<'a> Parser<'a> {
514514
}
515515

516516
debug_assert!(
517-
[token::DotDot, token::DotDotDot, token::DotDotEq].contains(&self.token.kind),
517+
self.token.is_range_separator(),
518518
"parse_prefix_range_expr: token {:?} is not DotDot/DotDotEq",
519519
self.token
520520
);
@@ -899,7 +899,11 @@ impl<'a> Parser<'a> {
899899
let has_lifetime = self.token.is_lifetime() && self.look_ahead(1, |t| t != &token::Colon);
900900
let lifetime = has_lifetime.then(|| self.expect_lifetime()); // For recovery, see below.
901901
let (borrow_kind, mutbl) = self.parse_borrow_modifiers(lo);
902-
let expr = self.parse_prefix_expr(None);
902+
let expr = if self.token.is_range_separator() {
903+
self.parse_prefix_range_expr(None)
904+
} else {
905+
self.parse_prefix_expr(None)
906+
};
903907
let (hi, expr) = self.interpolated_or_expr_span(expr)?;
904908
let span = lo.to(hi);
905909
if let Some(lt) = lifetime {

src/test/ui/parser/issue-105634.rs

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// check-pass
2+
3+
fn main() {
4+
let _a = ..;
5+
let _b = ..=10;
6+
let _c = &..;
7+
let _d = &..=10;
8+
}

0 commit comments

Comments
 (0)