]> git.lizzy.rs Git - rust.git/commitdiff
Allow .. to be parsed as let initializer
authorDeep Majumder <deep.majumder2019@gmail.com>
Wed, 14 Dec 2022 13:40:03 +0000 (19:10 +0530)
committerDeep Majumder <deep.majumder2019@gmail.com>
Wed, 14 Dec 2022 13:42:30 +0000 (19:12 +0530)
.. and ..= are valid expressions, however when used in a let statement
it is not parsed.

compiler/rustc_ast/src/token.rs
compiler/rustc_parse/src/parser/expr.rs
src/test/ui/parser/issue-105634.rs [new file with mode: 0644]

index 7b8c0d79a17e8519f3fc79a3f65149db2f2537dc..5247007fdce98ad8efd02f87155e59ba080a038e 100644 (file)
@@ -379,6 +379,10 @@ pub fn uninterpolated_span(&self) -> Span {
         }
     }
 
+    pub fn is_range_seperator(&self) -> bool {
+        [DotDot, DotDotDot, DotDotEq].contains(&self.kind)
+    }
+
     pub fn is_op(&self) -> bool {
         match self.kind {
             Eq | Lt | Le | EqEq | Ne | Ge | Gt | AndAnd | OrOr | Not | Tilde | BinOp(_)
index 8a3545eb3be3ab5d874b9c11acc48761774706f1..7235b15a46be658c51ae753e7411d58e08604521 100644 (file)
@@ -180,7 +180,7 @@ pub(super) fn parse_assoc_expr_with(
                 LhsExpr::AttributesParsed(attrs) => Some(attrs),
                 _ => None,
             };
-            if [token::DotDot, token::DotDotDot, token::DotDotEq].contains(&self.token.kind) {
+            if self.token.is_range_seperator() {
                 return self.parse_prefix_range_expr(attrs);
             } else {
                 self.parse_prefix_expr(attrs)?
@@ -512,7 +512,7 @@ fn parse_prefix_range_expr(&mut self, attrs: Option<AttrWrapper>) -> PResult<'a,
         }
 
         debug_assert!(
-            [token::DotDot, token::DotDotDot, token::DotDotEq].contains(&self.token.kind),
+            self.token.is_range_seperator(),
             "parse_prefix_range_expr: token {:?} is not DotDot/DotDotEq",
             self.token
         );
@@ -896,7 +896,11 @@ fn parse_borrow_expr(&mut self, lo: Span) -> PResult<'a, (Span, ExprKind)> {
         let has_lifetime = self.token.is_lifetime() && self.look_ahead(1, |t| t != &token::Colon);
         let lifetime = has_lifetime.then(|| self.expect_lifetime()); // For recovery, see below.
         let (borrow_kind, mutbl) = self.parse_borrow_modifiers(lo);
-        let expr = self.parse_prefix_expr(None);
+        let expr = if self.token.is_range_seperator() {
+            self.parse_prefix_range_expr(None)
+        } else {
+            self.parse_prefix_expr(None)
+        };
         let (hi, expr) = self.interpolated_or_expr_span(expr)?;
         let span = lo.to(hi);
         if let Some(lt) = lifetime {
diff --git a/src/test/ui/parser/issue-105634.rs b/src/test/ui/parser/issue-105634.rs
new file mode 100644 (file)
index 0000000..7a094d8
--- /dev/null
@@ -0,0 +1,8 @@
+// run-pass
+
+fn main() {
+    let _a = ..;
+    let _b = ..=10;
+    let _c = &..;
+    let _d = &..=10;
+}