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:
commit
9eedd138ee
13 changed files with 154 additions and 7 deletions
2
src/test/ui/parser/shebang/issue-71471-ignore-tidy.rs
Normal file
2
src/test/ui/parser/shebang/issue-71471-ignore-tidy.rs
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
#!B //~ expected `[`, found `B`
|
||||
|
|
@ -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
|
||||
|
||||
7
src/test/ui/parser/shebang/multiline-attrib.rs
Normal file
7
src/test/ui/parser/shebang/multiline-attrib.rs
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#!
|
||||
[allow(unused_variables)]
|
||||
// check-pass
|
||||
|
||||
fn main() {
|
||||
let x = 5;
|
||||
}
|
||||
5
src/test/ui/parser/shebang/regular-attrib.rs
Normal file
5
src/test/ui/parser/shebang/regular-attrib.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
#![allow(unused_variables)]
|
||||
// check-pass
|
||||
fn main() {
|
||||
let x = 5;
|
||||
}
|
||||
9
src/test/ui/parser/shebang/shebang-and-attrib.rs
Normal file
9
src/test/ui/parser/shebang/shebang-and-attrib.rs
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
#!/usr/bin/env run-cargo-script
|
||||
|
||||
// check-pass
|
||||
#![allow(unused_variables)]
|
||||
|
||||
|
||||
fn main() {
|
||||
let x = 5;
|
||||
}
|
||||
6
src/test/ui/parser/shebang/shebang-comment.rs
Normal file
6
src/test/ui/parser/shebang/shebang-comment.rs
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#!//bin/bash
|
||||
|
||||
// check-pass
|
||||
fn main() {
|
||||
println!("a valid shebang (that is also a rust comment)")
|
||||
}
|
||||
6
src/test/ui/parser/shebang/shebang-must-start-file.rs
Normal file
6
src/test/ui/parser/shebang/shebang-must-start-file.rs
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
// something on the first line for tidy
|
||||
#!/bin/bash //~ expected `[`, found `/`
|
||||
|
||||
fn main() {
|
||||
println!("ok!");
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
16
src/test/ui/parser/shebang/sneaky-attrib.rs
Normal file
16
src/test/ui/parser/shebang/sneaky-attrib.rs
Normal 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;
|
||||
}
|
||||
6
src/test/ui/parser/shebang/valid-shebang.rs
Normal file
6
src/test/ui/parser/shebang/valid-shebang.rs
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#!/usr/bin/env run-cargo-script
|
||||
|
||||
// check-pass
|
||||
fn main() {
|
||||
println!("Hello World!");
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue