Skip to content

Less maybe_whole_expr, take 2 #126571

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 1 commit into from
Jun 27, 2024

Conversation

nnethercote
Copy link
Contributor

@nnethercote nnethercote commented Jun 17, 2024

I first tried this in #107550. I now think it's worth doing again, as a precursor to #124141.

r? @petrochenkov

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Jun 17, 2024
@petrochenkov
Copy link
Contributor

This needs a crater run because the error is now reported even under #[cfg(FALSE)].
@bors try

@petrochenkov petrochenkov added S-waiting-on-crater Status: Waiting on a crater run to be completed. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 17, 2024
@bors
Copy link
Collaborator

bors commented Jun 17, 2024

⌛ Trying commit 74a18a0 with merge 397f895...

bors added a commit to rust-lang-ci/rust that referenced this pull request Jun 17, 2024
… r=<try>

Less `maybe_whole_expr`, take 2

I first tried this in rust-lang#107550. I now think it's worth doing again, as a precursor to #1241414.

r? `@petrochenkov`
@bors
Copy link
Collaborator

bors commented Jun 17, 2024

☀️ Try build successful - checks-actions
Build commit: 397f895 (397f8958d101b259f6baaf92d107d770c95c3ce0)

@petrochenkov
Copy link
Contributor

@craterbot check

@craterbot
Copy link
Collaborator

👌 Experiment pr-126571 created and queued.
🤖 Automatically detected try build 397f895
🔍 You can check out the queue and this experiment's details.

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot
Copy link
Collaborator

🚧 Experiment pr-126571 is now running

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot
Copy link
Collaborator

🎉 Experiment pr-126571 is completed!
📊 927 regressed and 7 fixed (473144 total)
📰 Open the full report.

⚠️ If you notice any spurious failure please add them to the blacklist!
ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot craterbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-crater Status: Waiting on a crater run to be completed. labels Jun 20, 2024
@nnethercote
Copy link
Contributor Author

nnethercote commented Jun 20, 2024

Lots of crater failures. A quick scan indicates that the unic-ucd-segment crate is responsible for most of the failures. I checked and found that it builds ok with the first commit applied, but fails with the second commit. It has some complicated multi-level declarative macros. If I change parse_literal_maybe_minus to also handle ExprKind::MacCall (in the same way it handles ExprKind::Lit) then unic-ucd-segment compiles again.

@nnethercote
Copy link
Contributor Author

rustsec also fails, and it needs ExprKind::Path to be handled in parse_literal_maybe_minus.

It's interesting that can_begin_literal_maybe_minus does not include ExprKind::{MacCall,Path}.

@petrochenkov
Copy link
Contributor

In the token based model neither mac!() nor path::to::somewhere are any close to literals, so I don't expect this to work even if the none-delimited groups become "untyped" some time after the removal of nonterminals.
So these cases should probably report a deprecation lint.

@petrochenkov petrochenkov added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 20, 2024
@nnethercote
Copy link
Contributor Author

The ExprKind::MacCall case for unic-ucd-segment looks like stringify!(CR).

The ExprKind::Path case in rustsec is just an identifier YEAR_MIN, not a full path.

I will update the code to allow these two ExprKinds, and then do another crater run on the failing crates, to see if there are any other ExprKinds occurring.

@nnethercote
Copy link
Contributor Author

Hmm, looking at the ExprKind::Path case some more, I think the real problem is in rustc. Consider this code:

macro_rules! range {
    ($min:expr, $max:expr) => {
        $min ..= $max
    }
}

const MAX: u32 = 10;

fn main() {
    match 3 {
        range!(0, MAX) => {}
        _ => {}
    }
}

It compiles fine with stable rustc. With the original version of this PR applied (i.e. without ExprKind::Path handling added to parse_maybe_literal_minus) it fails like this:

error: unexpected token: expression `MAX`
  --> p.rs:3:18
   |
3  |         $min ..= $max
   |                  ^^^^
...
11 |         range!(0, MAX) => {}
   |         --------------
   |         |
   |         this macro call doesn't expand to a pattern
   |         in this macro invocation
   |
   = note: this error originates in the macro `range` (in Nightly builds, run with -Z macro-backtrace for more info)

Adding ExprKind::Path handling to parse_maybe_literal_minus makes it compile again, but that's not the right solution. The real problem is in parse_pat_range_end:

let bound = if self.check_inline_const(0) {
self.parse_const_block(self.token.span, true)
} else if self.check_path() {
let lo = self.token.span;
let (qself, path) = if self.eat_lt() {
// Parse a qualified path
let (qself, path) = self.parse_qpath(PathStyle::Pat)?;
(Some(qself), path)
} else {
// Parse an unqualified path
(None, self.parse_path(PathStyle::Pat)?)
};
let hi = self.prev_token.span;
Ok(self.mk_expr(lo.to(hi), ExprKind::Path(qself, path)))
} else {
self.parse_literal_maybe_minus()
}?;

What happens in check_path? It fails! Because it relies on Token::is_path_start, which relies on Token::is_whole_path, which succeeds for NtPath but not for NtExpr(... ExprKind::Path ...).

So then we fall through to parse_maybe_literal_minus, which succeeds on stable because it accepts any NtExpr, but fails with this PR because it doesn't accept NtExpr(... ExprKind::Path ...).

The real solution is that parse_pat_range_end should handle NtExpr(... ExprKind::Path ...) before calling parse_maybe_literal_minus. There's almost certainly a similar problem for the start of pattern ranges.

I don't know yet if the MacCall case is like this or not.

@nnethercote
Copy link
Contributor Author

While looking at the ExprKind::Path stuff more closely, I found this in parse_path_inner:

maybe_whole!(self, NtPath, |path| reject_generics_if_mod_style(self, path.into_inner()));
if let token::Interpolated(nt) = &self.token.kind {
if let token::NtTy(ty) = &**nt {
if let ast::TyKind::Path(None, path) = &ty.kind {
let path = path.clone();
self.bump();
return Ok(reject_generics_if_mod_style(self, path));
}
}
}

It accepts NtPath and NtTy(... TyKind::Path ...). @dtolnay added the latter part in #91150. I think it will need to allow NtExpr(... ExprKind::Path ...) to address the problem I described in the previous comment. And then I wonder if NtPat(... PatKind::Path ...) should also be allowed.

And remove the `NtPath` and `NtBlock` cases in
`parse_literal_maybe_minus`, because they are unnecessary.
@nnethercote nnethercote force-pushed the less-maybe_whole-expr-2 branch from 74a18a0 to 379b761 Compare June 25, 2024 04:58
@nnethercote
Copy link
Contributor Author

@bors try

@bors
Copy link
Collaborator

bors commented Jun 25, 2024

⌛ Trying commit 379b761 with merge 0ecd73a...

bors added a commit to rust-lang-ci/rust that referenced this pull request Jun 25, 2024
… r=<try>

Less `maybe_whole_expr`, take 2

I first tried this in rust-lang#107550. I now think it's worth doing again, as a precursor to rust-lang#124141.

r? `@petrochenkov`
@bors
Copy link
Collaborator

bors commented Jun 25, 2024

☀️ Try build successful - checks-actions
Build commit: 0ecd73a (0ecd73ac69e42f0c7915911f31169e93143ae55d)

@nnethercote
Copy link
Contributor Author

Getting the path stuff right is a bit tricky, so I think it's worth merging just the first commit here. Let's re-do the failures from the last crater run:

@craterbot check p=1 crates=https://crater-reports.s3.amazonaws.com/pr-126571/retry-regressed-list.txt

@craterbot
Copy link
Collaborator

👌 Experiment pr-126571-1 created and queued.
🤖 Automatically detected try build 0ecd73a
🔍 You can check out the queue and this experiment's details.

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot craterbot added S-waiting-on-crater Status: Waiting on a crater run to be completed. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Jun 25, 2024
@craterbot
Copy link
Collaborator

🚧 Experiment pr-126571-1 is now running

ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot
Copy link
Collaborator

🎉 Experiment pr-126571-1 is completed!
📊 0 regressed and 0 fixed (927 total)
📰 Open the full report.

⚠️ If you notice any spurious failure please add them to the blacklist!
ℹ️ Crater is a tool to run experiments across parts of the Rust ecosystem. Learn more

@craterbot craterbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. and removed S-waiting-on-crater Status: Waiting on a crater run to be completed. labels Jun 26, 2024
@nnethercote
Copy link
Contributor Author

No failures when re-running the crater failures with just the first commit applied. I think it's worth merging now and thinking about the additional restrictions on ExprKind in a follow-up. @petrochenkov, what do you think?

@petrochenkov
Copy link
Contributor

@bors r+

@bors
Copy link
Collaborator

bors commented Jun 26, 2024

📌 Commit 379b761 has been approved by petrochenkov

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Jun 26, 2024
@nnethercote
Copy link
Contributor Author

@bors rollup

matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Jun 26, 2024
…2, r=petrochenkov

Less `maybe_whole_expr`, take 2

I first tried this in rust-lang#107550. I now think it's worth doing again, as a precursor to rust-lang#124141.

r? `@petrochenkov`
bors added a commit to rust-lang-ci/rust that referenced this pull request Jun 26, 2024
…iaskrgr

Rollup of 9 pull requests

Successful merges:

 - rust-lang#125016 (Update compiler_builtins to 0.1.113)
 - rust-lang#126571 (Less `maybe_whole_expr`, take 2)
 - rust-lang#126721 (coverage: Make `#[coverage(..)]` apply recursively to nested functions)
 - rust-lang#126928 (Some `Nonterminal` removal precursors)
 - rust-lang#126929 (Remove `__rust_force_expr`.)
 - rust-lang#126941 (Migrate `run-make/llvm-ident` to `rmake.rs`)
 - rust-lang#126970 (Simplify `str::clone_into`)
 - rust-lang#126980 (set self.is_known_utf8 to false in extend_from_slice)
 - rust-lang#126983 (Remove `f16` and `f128` ICE paths from smir)

r? `@ghost`
`@rustbot` modify labels: rollup
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Jun 26, 2024
…2, r=petrochenkov

Less `maybe_whole_expr`, take 2

I first tried this in rust-lang#107550. I now think it's worth doing again, as a precursor to rust-lang#124141.

r? ``@petrochenkov``
bors added a commit to rust-lang-ci/rust that referenced this pull request Jun 26, 2024
…iaskrgr

Rollup of 9 pull requests

Successful merges:

 - rust-lang#125016 (Update compiler_builtins to 0.1.113)
 - rust-lang#126571 (Less `maybe_whole_expr`, take 2)
 - rust-lang#126692 (patch `rust-lld` and `ld.lld` on NixOS)
 - rust-lang#126721 (coverage: Make `#[coverage(..)]` apply recursively to nested functions)
 - rust-lang#126928 (Some `Nonterminal` removal precursors)
 - rust-lang#126929 (Remove `__rust_force_expr`.)
 - rust-lang#126970 (Simplify `str::clone_into`)
 - rust-lang#126980 (set self.is_known_utf8 to false in extend_from_slice)
 - rust-lang#126983 (Remove `f16` and `f128` ICE paths from smir)

r? `@ghost`
`@rustbot` modify labels: rollup
bors added a commit to rust-lang-ci/rust that referenced this pull request Jun 27, 2024
Rollup of 6 pull requests

Successful merges:

 - rust-lang#126571 (Less `maybe_whole_expr`, take 2)
 - rust-lang#126721 (coverage: Make `#[coverage(..)]` apply recursively to nested functions)
 - rust-lang#126928 (Some `Nonterminal` removal precursors)
 - rust-lang#126929 (Remove `__rust_force_expr`.)
 - rust-lang#126980 (set self.is_known_utf8 to false in extend_from_slice)
 - rust-lang#126983 (Remove `f16` and `f128` ICE paths from smir)

r? `@ghost`
`@rustbot` modify labels: rollup
@bors bors merged commit 5ec93b8 into rust-lang:master Jun 27, 2024
7 checks passed
@rustbot rustbot added this to the 1.81.0 milestone Jun 27, 2024
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Jun 27, 2024
Rollup merge of rust-lang#126571 - nnethercote:less-maybe_whole-expr-2, r=petrochenkov

Less `maybe_whole_expr`, take 2

I first tried this in rust-lang#107550. I now think it's worth doing again, as a precursor to rust-lang#124141.

r? ```@petrochenkov```
@nnethercote nnethercote deleted the less-maybe_whole-expr-2 branch June 27, 2024 23:33
nnethercote added a commit to nnethercote/rust that referenced this pull request Jul 16, 2024
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants