Skip to content

Commit c4d0c91

Browse files
committed
Allow .. to be parsed as let initializer
.. and ..= are valid expressions, however when used in a let statement it is not parsed.
1 parent 71ec145 commit c4d0c91

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_seperator(&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
@@ -180,7 +180,7 @@ impl<'a> Parser<'a> {
180180
LhsExpr::AttributesParsed(attrs) => Some(attrs),
181181
_ => None,
182182
};
183-
if [token::DotDot, token::DotDotDot, token::DotDotEq].contains(&self.token.kind) {
183+
if self.token.is_range_seperator() {
184184
return self.parse_prefix_range_expr(attrs);
185185
} else {
186186
self.parse_prefix_expr(attrs)?
@@ -512,7 +512,7 @@ impl<'a> Parser<'a> {
512512
}
513513

514514
debug_assert!(
515-
[token::DotDot, token::DotDotDot, token::DotDotEq].contains(&self.token.kind),
515+
self.token.is_range_seperator(),
516516
"parse_prefix_range_expr: token {:?} is not DotDot/DotDotEq",
517517
self.token
518518
);
@@ -896,7 +896,11 @@ impl<'a> Parser<'a> {
896896
let has_lifetime = self.token.is_lifetime() && self.look_ahead(1, |t| t != &token::Colon);
897897
let lifetime = has_lifetime.then(|| self.expect_lifetime()); // For recovery, see below.
898898
let (borrow_kind, mutbl) = self.parse_borrow_modifiers(lo);
899-
let expr = self.parse_prefix_expr(None);
899+
let expr = if self.token.is_range_seperator() {
900+
self.parse_prefix_range_expr(None)
901+
} else {
902+
self.parse_prefix_expr(None)
903+
};
900904
let (hi, expr) = self.interpolated_or_expr_span(expr)?;
901905
let span = lo.to(hi);
902906
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+
// run-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)