about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorZack M. Davis <code@zackmdavis.net>2017-12-30 21:16:16 -0800
committerZack M. Davis <code@zackmdavis.net>2017-12-30 21:16:16 -0800
commitb0f880ddd95b5ed73bb9db66119c730fecb23fad (patch)
treedc662f728a3f999394661128515e6e59d2abbd08 /src
parent54d7285a349a3558755a31bba5682d7618b66967 (diff)
in which leading zeroes on tuple-struct accesses are abjured
Resolves #47073.
Diffstat (limited to 'src')
-rw-r--r--src/libsyntax/parse/parser.rs15
-rw-r--r--src/test/ui/issue-47073-zero-padded-tuple-struct-indices.rs22
-rw-r--r--src/test/ui/issue-47073-zero-padded-tuple-struct-indices.stderr14
3 files changed, 48 insertions, 3 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index a4aad81f5f5..1a2146509e3 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2592,7 +2592,7 @@ impl<'a> Parser<'a> {
                   token::Ident(..) => {
                     e = self.parse_dot_suffix(e, lo)?;
                   }
-                  token::Literal(token::Integer(n), suf) => {
+                  token::Literal(token::Integer(index_ident), suf) => {
                     let sp = self.span;
 
                     // A tuple index may not have a suffix
@@ -2602,16 +2602,25 @@ impl<'a> Parser<'a> {
                     hi = self.span;
                     self.bump();
 
-                    let index = n.as_str().parse::<usize>().ok();
+                    let invalid_msg = "invalid tuple or struct index";
+
+                    let index = index_ident.as_str().parse::<usize>().ok();
                     match index {
                         Some(n) => {
+                            if n.to_string() != index_ident.as_str() {
+                                let mut err = self.struct_span_err(self.prev_span, invalid_msg);
+                                err.span_suggestion(self.prev_span,
+                                                    "try simplifying the index",
+                                                    n.to_string());
+                                err.emit();
+                            }
                             let id = respan(dot_span.to(hi), n);
                             let field = self.mk_tup_field(e, id);
                             e = self.mk_expr(lo.to(hi), field, ThinVec::new());
                         }
                         None => {
                             let prev_span = self.prev_span;
-                            self.span_err(prev_span, "invalid tuple or tuple struct index");
+                            self.span_err(prev_span, invalid_msg);
                         }
                     }
                   }
diff --git a/src/test/ui/issue-47073-zero-padded-tuple-struct-indices.rs b/src/test/ui/issue-47073-zero-padded-tuple-struct-indices.rs
new file mode 100644
index 00000000000..e339716289c
--- /dev/null
+++ b/src/test/ui/issue-47073-zero-padded-tuple-struct-indices.rs
@@ -0,0 +1,22 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+type Guilty = bool;
+type FineDollars = u32;
+
+struct Verdict(Guilty, Option<FineDollars>);
+
+fn main() {
+    let justice = Verdict(true, Some(2718));
+    let _condemned = justice.00;
+    //~^ ERROR invalid tuple or struct index
+    let _punishment = justice.001;
+    //~^ ERROR invalid tuple or struct index
+}
diff --git a/src/test/ui/issue-47073-zero-padded-tuple-struct-indices.stderr b/src/test/ui/issue-47073-zero-padded-tuple-struct-indices.stderr
new file mode 100644
index 00000000000..24b3c263b63
--- /dev/null
+++ b/src/test/ui/issue-47073-zero-padded-tuple-struct-indices.stderr
@@ -0,0 +1,14 @@
+error: invalid tuple or struct index
+  --> $DIR/issue-47073-zero-padded-tuple-struct-indices.rs:18:30
+   |
+18 |     let _condemned = justice.00;
+   |                              ^^ help: try simplifying the index: `0`
+
+error: invalid tuple or struct index
+  --> $DIR/issue-47073-zero-padded-tuple-struct-indices.rs:20:31
+   |
+20 |     let _punishment = justice.001;
+   |                               ^^^ help: try simplifying the index: `1`
+
+error: aborting due to 2 previous errors
+