Auto merge of #71487 - rcoh:71471-shebang, r=petrochenkov

Fix bug in shebang handling

Shebang handling was too agressive in stripping out the first line in cases where it is actually _not_ a shebang, but instead, valid rust (#70528). This is a second attempt at resolving this issue (the first attempt was reverted, for, among other reasons, causing an ICE in certain cases (#71372, #71471).

The behavior is now codified by a number of UI tests, but simply:
For the first line to be a shebang, the following must all be true:
1. The line must start with `#!`
2. The line must contain a non-whitespace character after `#!`
3. The next character in the file, ignoring comments & whitespace must not be `[`

I believe this is a strict superset of what we used to allow, so perhaps a crater run is unnecessary, but probably not a terrible idea.

Fixes #70528
This commit is contained in:
bors 2020-05-26 01:43:40 +00:00
commit 9eedd138ee
13 changed files with 154 additions and 7 deletions

View file

@ -0,0 +1,2 @@
#!B //~ expected `[`, found `B`

View file

@ -0,0 +1,8 @@
error: expected `[`, found `B`
--> $DIR/issue-71471-ignore-tidy.rs:2:3
|
LL | #!B
| ^ expected `[`
error: aborting due to previous error

View file

@ -0,0 +1,7 @@
#!
[allow(unused_variables)]
// check-pass
fn main() {
let x = 5;
}

View file

@ -0,0 +1,5 @@
#![allow(unused_variables)]
// check-pass
fn main() {
let x = 5;
}

View file

@ -0,0 +1,9 @@
#!/usr/bin/env run-cargo-script
// check-pass
#![allow(unused_variables)]
fn main() {
let x = 5;
}

View file

@ -0,0 +1,6 @@
#!//bin/bash
// check-pass
fn main() {
println!("a valid shebang (that is also a rust comment)")
}

View file

@ -0,0 +1,6 @@
// something on the first line for tidy
#!/bin/bash //~ expected `[`, found `/`
fn main() {
println!("ok!");
}

View file

@ -0,0 +1,8 @@
error: expected `[`, found `/`
--> $DIR/shebang-must-start-file.rs:2:3
|
LL | #!/bin/bash
| ^ expected `[`
error: aborting due to previous error

View file

@ -0,0 +1,16 @@
#!//bin/bash
// This could not possibly be a shebang & also a valid rust file, since a Rust file
// can't start with `[`
/*
[ (mixing comments to also test that we ignore both types of comments)
*/
[allow(unused_variables)]
// check-pass
fn main() {
let x = 5;
}

View file

@ -0,0 +1,6 @@
#!/usr/bin/env run-cargo-script
// check-pass
fn main() {
println!("Hello World!");
}