about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2020-04-22 10:34:07 +0900
committerGitHub <noreply@github.com>2020-04-22 10:34:07 +0900
commit46a8dcef5c9e4de0d412c6ac3c4765cb4aef4f7f (patch)
tree03c82ba6efbedbca8c5ea2f63e030f1735cab92d /src
parentf28e3873c55eb4bdcfc496e1f300b97aeb0d189c (diff)
parent1b362cd1d5f09f0031b2ce1b161152422a397a67 (diff)
downloadrust-46a8dcef5c9e4de0d412c6ac3c4765cb4aef4f7f.tar.gz
rust-46a8dcef5c9e4de0d412c6ac3c4765cb4aef4f7f.zip
Rollup merge of #71372 - ayushmishra2005:shebang_stripping, r=estebank
Fix #! (shebang) stripping account space issue

 #70528
Diffstat (limited to 'src')
-rw-r--r--src/librustc_lexer/src/lib.rs7
-rw-r--r--src/librustc_lexer/src/tests.rs18
2 files changed, 24 insertions, 1 deletions
diff --git a/src/librustc_lexer/src/lib.rs b/src/librustc_lexer/src/lib.rs
index 5ccfc1b276b..be85a34bd39 100644
--- a/src/librustc_lexer/src/lib.rs
+++ b/src/librustc_lexer/src/lib.rs
@@ -236,12 +236,17 @@ pub enum Base {
 /// (e.g. "#![deny(missing_docs)]").
 pub fn strip_shebang(input: &str) -> Option<usize> {
     debug_assert!(!input.is_empty());
-    if !input.starts_with("#!") || input.starts_with("#![") {
+    let s: &str = &remove_whitespace(input);
+    if !s.starts_with("#!") || s.starts_with("#![") {
         return None;
     }
     Some(input.find('\n').unwrap_or(input.len()))
 }
 
+fn remove_whitespace(s: &str) -> String {
+    s.chars().filter(|c| !c.is_whitespace()).collect()
+}
+
 /// Parses the first token from the provided input string.
 pub fn first_token(input: &str) -> Token {
     debug_assert!(!input.is_empty());
diff --git a/src/librustc_lexer/src/tests.rs b/src/librustc_lexer/src/tests.rs
index 06fc159fe25..065e8f3f646 100644
--- a/src/librustc_lexer/src/tests.rs
+++ b/src/librustc_lexer/src/tests.rs
@@ -145,4 +145,22 @@ mod tests {
             }),
         );
     }
+
+    #[test]
+    fn test_valid_shebang() {
+        // https://github.com/rust-lang/rust/issues/70528
+        let input = "#!/usr/bin/rustrun";
+        let actual = strip_shebang(input);
+        let expected: Option<usize> = Some(18);
+        assert_eq!(expected, actual);
+    }
+
+    #[test]
+    fn test_invalid_shebang_valid_rust_syntax() {
+        // https://github.com/rust-lang/rust/issues/70528
+        let input = "#!    [bad_attribute]";
+        let actual = strip_shebang(input);
+        let expected: Option<usize> = None;
+        assert_eq!(expected, actual);
+    }
 }