From ed6c6c9a11f7deddbd1f209c5e7de12bc420c550 Mon Sep 17 00:00:00 2001 From: Masaki Hara Date: Sun, 14 May 2017 21:37:50 +0900 Subject: [PATCH 1/2] Disallow underscore suffix for string-like literals. --- src/libsyntax/parse/lexer/mod.rs | 6 +----- src/test/parse-fail/underscore-suffix-for-string.rs | 13 +++++++++++++ 2 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 src/test/parse-fail/underscore-suffix-for-string.rs diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index a83b19c7334e7..480049f845c35 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -479,11 +479,7 @@ impl<'a> StringReader<'a> { } self.with_str_from(start, |string| { - if string == "_" { - None - } else { - Some(Symbol::intern(string)) - } + Some(Symbol::intern(string)) }) } diff --git a/src/test/parse-fail/underscore-suffix-for-string.rs b/src/test/parse-fail/underscore-suffix-for-string.rs new file mode 100644 index 0000000000000..a19bbe0837704 --- /dev/null +++ b/src/test/parse-fail/underscore-suffix-for-string.rs @@ -0,0 +1,13 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +fn main() { + let a = "Foo"_; //~ ERROR string literal with a suffix is invalid +} From 0b8c3de678065b82ae955b65192b7927b467f7a6 Mon Sep 17 00:00:00 2001 From: Masaki Hara Date: Wed, 31 May 2017 16:43:47 +0900 Subject: [PATCH 2/2] Add warning cycle #42326. --- src/libsyntax/parse/lexer/mod.rs | 15 ++++++++++++++- .../parse-fail/underscore-suffix-for-string.rs | 9 ++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs index 480049f845c35..e8fbc00d36f06 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -479,7 +479,20 @@ impl<'a> StringReader<'a> { } self.with_str_from(start, |string| { - Some(Symbol::intern(string)) + if string == "_" { + self.sess.span_diagnostic + .struct_span_warn(mk_sp(start, self.pos), + "underscore literal suffix is not allowed") + .warn("this was previously accepted by the compiler but is \ + being phased out; it will become a hard error in \ + a future release!") + .note("for more information, see issue #42326 \ + ") + .emit(); + None + } else { + Some(Symbol::intern(string)) + } }) } diff --git a/src/test/parse-fail/underscore-suffix-for-string.rs b/src/test/parse-fail/underscore-suffix-for-string.rs index a19bbe0837704..05de5f8e1941b 100644 --- a/src/test/parse-fail/underscore-suffix-for-string.rs +++ b/src/test/parse-fail/underscore-suffix-for-string.rs @@ -9,5 +9,12 @@ // except according to those terms. fn main() { - let a = "Foo"_; //~ ERROR string literal with a suffix is invalid + let _ = "Foo"_; + //~^ WARNING underscore literal suffix is not allowed + //~| WARNING this was previously accepted + //~| NOTE issue #42326 } + +FAIL +//~^ ERROR +//~| NOTE