diff options
| author | bors <bors@rust-lang.org> | 2025-03-14 17:00:17 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-03-14 17:00:17 +0000 |
| commit | ecade534c66478c51c5d3c1d3682dc4beb0ac972 (patch) | |
| tree | 63a6d810b2b522dc88674b7694126b682a6d79d1 /compiler/rustc_parse/src/parser | |
| parent | cb50d4d8566b1ee97e9a5ef95a37a40936a62c30 (diff) | |
| parent | 401b325fb765e3cc2453bca2d8139088dd1d3e96 (diff) | |
| download | rust-ecade534c66478c51c5d3c1d3682dc4beb0ac972.tar.gz rust-ecade534c66478c51c5d3c1d3682dc4beb0ac972.zip | |
Auto merge of #138506 - fmease:rollup-ve4h2eq, r=fmease
Rollup of 9 pull requests Successful merges: - #134720 (Display valid crate types in error message for --crate-type flag) - #137619 (Provide helpful diagnostics for shebang lookalikes) - #138353 (remove must_use from <*const T>::expose_provenance) - #138452 (Remove `RUN_CHECK_WITH_PARALLEL_QUERIES`) - #138469 (remove comment regarding a removed test directive) - #138477 (Deny impls for `BikeshedGuaranteedNoDrop`) - #138485 (Rustc dev guide subtree update) - #138487 (Pass `CI_JOB_DOC_URL` to Docker) - #138495 (Take a break from reviews) r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler/rustc_parse/src/parser')
| -rw-r--r-- | compiler/rustc_parse/src/parser/attr.rs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/compiler/rustc_parse/src/parser/attr.rs b/compiler/rustc_parse/src/parser/attr.rs index 066b570c23f..53614049f08 100644 --- a/compiler/rustc_parse/src/parser/attr.rs +++ b/compiler/rustc_parse/src/parser/attr.rs @@ -127,12 +127,29 @@ impl<'a> Parser<'a> { let lo = self.token.span; // Attributes can't have attributes of their own [Editor's note: not with that attitude] self.collect_tokens_no_attrs(|this| { + let pound_hi = this.token.span.hi(); assert!(this.eat(exp!(Pound)), "parse_attribute called in non-attribute position"); + let not_lo = this.token.span.lo(); let style = if this.eat(exp!(Bang)) { ast::AttrStyle::Inner } else { ast::AttrStyle::Outer }; - this.expect(exp!(OpenBracket))?; + let mut bracket_res = this.expect(exp!(OpenBracket)); + // If `#!` is not followed by `[` + if let Err(err) = &mut bracket_res + && style == ast::AttrStyle::Inner + && pound_hi == not_lo + { + err.note( + "the token sequence `#!` here looks like the start of \ + a shebang interpreter directive but it is not", + ); + err.help( + "if you meant this to be a shebang interpreter directive, \ + move it to the very start of the file", + ); + } + bracket_res?; let item = this.parse_attr_item(ForceCollect::No)?; this.expect(exp!(CloseBracket))?; let attr_sp = lo.to(this.prev_token.span); |
