<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rust/compiler/rustc_parse/src/parser/mod.rs, branch cargo_update</title>
<subtitle>https://github.com/rust-lang/rust
</subtitle>
<id>http://git.dreamy.place/mirrors/rust/atom?h=cargo_update</id>
<link rel='self' href='http://git.dreamy.place/mirrors/rust/atom?h=cargo_update'/>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/'/>
<updated>2025-09-09T15:32:20+00:00</updated>
<entry>
<title>Rollup merge of #145463 - jieyouxu:error-suffix, r=fmease</title>
<updated>2025-09-09T15:32:20+00:00</updated>
<author>
<name>Matthias Krüger</name>
<email>476013+matthiaskrgr@users.noreply.github.com</email>
</author>
<published>2025-09-09T15:32:20+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=12e548704e5c21c6f90a73937b3a7279119542c0'/>
<id>urn:sha1:12e548704e5c21c6f90a73937b3a7279119542c0</id>
<content type='text'>
Reject invalid literal suffixes in tuple indexing, tuple struct indexing, and struct field name position

Tracking issue: rust-lang/rust#60210
Closes rust-lang/rust#60210

## Summary

Bump the ["suffixes on a tuple index are invalid" non-lint pseudo future-incompatibility warning (#60210)][issue-60210][^non-lint] to a **hard error** across all editions, rejecting the remaining carve outs from accidentally accepted invalid suffixes since Rust **1.27**.

- We accidentally accepted invalid suffixes in tuple indexing positions in Rust **1.27**. Originally reported at https://github.com/rust-lang/rust/issues/59418.
- We tried to hard reject all invalid suffixes in https://github.com/rust-lang/rust/pull/59421, but unfortunately it turns out there were proc macros accidentally relying on it: https://github.com/rust-lang/rust/issues/60138.
- We temporarily accepted `{i,u}{32,size}` in https://github.com/rust-lang/rust/pull/60186 (the "*carve outs*") to mitigate *immediate* ecosystem impact, but it came with an FCW warning indicating that we wanted to reject it after a few Rust releases.
- Now (1.89.0) is a few Rust releases later (1.35.0), thus I'm proposing to **also reject the carve outs**.
    - `std::mem::offset_of!` stabilized in Rust **1.77.0** happens to use the same "don't expect suffix" code path which has the carve outs, so it also accepted the carve out suffixes. I'm proposing to **reject this case as well**.

## What specifically breaks?

Code that still relied on invalid `{i,u}{32,size}` suffixes being temporarily accepted by rust-lang/rust#60186 as an ecosystem impact mitigation measure (cf. rust-lang/rust#60138). Specifically, the following cases (particularly the construction of these forms in proc macros like reported in rust-lang/rust#60138):

### Position 1: Invalid `{i,u}{32,size}` suffixes in tuple indexing

```rs
fn main() {
    let _x = (42,).0invalid; // Already error, already rejected by #59421
    let _x = (42,).0i8;      // Already error, not one of the #60186 carve outs.
    let _x = (42,).0usize;   // warning: suffixes on a tuple index are invalid
}
```

### Position 2: Invalid `{i,u}{32,size}` suffixes in tuple struct indexing

```rs
fn main() {
    struct X(i32);
    let _x = X(42);
	let _x = _x.0invalid; // Already error, already rejected by #59421
    let _x = _x.0i8;      // Already error, not one of the #60186 carve outs.
    let _x = _x.0usize;   // warning: suffixes on a tuple index are invalid
}
```

### Position 3: Invalid `{i,u}{32,size}` suffixes in numeric struct field names

```rs
fn main() {
    struct X(i32, i32, i32);
    let _x = X(1, 2, 3);
    let _y = X { 0usize: 42, 1: 42, 2: 42 };    // warning: suffixes on a tuple index are invalid
	match _x {
        X { 0usize: 1, 1: 2, 2: 3 } =&gt; todo!(), // warning: suffixes on a tuple index are invalid
        _ =&gt; {}
    }
}
```

### Position 4: Invalid `{i,u}{32,size}` suffixes in `std::mem::offset_of!`

While investigating the warning, unfortunately I noticed `std::mem::offset_of!` also happens to use the "expect no suffix" code path which had the carve outs. So this was accepted since Rust **1.77.0** with the same FCW:

```rs
fn main() {
    #[repr(C)]
    pub struct Struct&lt;T&gt;(u8, T);

    assert_eq!(std::mem::offset_of!(Struct&lt;u32&gt;, 0usize), 0);
    //~^ WARN suffixes on a tuple index are invalid
}
```

### The above forms in proc macros

For instance, constructions like (see tracking issue rust-lang/rust#60210):

```rs
let i = 0;
quote! { foo.$i }
```

where the user needs to actually write

```rs
let i = syn::Index::from(0);
quote! { foo.$i }
```

### Crater results

Conducted a crater run (https://github.com/rust-lang/rust/pull/145463#issuecomment-3194920383).

- https://github.com/AmlingPalantir/r4/tree/256af3c72f094b298cd442097ef7c571d8001f29: genuine regression; "invalid suffix `usize`" in derive macro. Has a ton of other build warnings, last updated 6 years ago.
    - Exactly the kind of intended breakage. Minimized down to https://github.com/AmlingPalantir/r4/blob/256af3c72f094b298cd442097ef7c571d8001f29/validates_derive/src/lib.rs#L71-L75, where when interpolation uses `quote`'s `ToTokens` on a `usize` index (i.e. on tuple struct `Tup(())`), the generated suffix becomes `.0usize` (cf. Position 2).
    - Notified crate author of breakage in https://github.com/AmlingPalantir/r4/issues/1.
- Other failures are unrelated or spurious.

## Review remarks

- Commits 1-3 expands the test coverage to better reflect the current situation before doing any functional changes.
- Commit 4 is an intentional **breaking change**. We bump the non-lint "suffixes on a tuple index are invalid" warning into a hard error. Thus, this will need a crater run and a T-lang FCP.

## Tasks

- [x] Run crater to check if anyone is still relying on this being not a hard error. Determine degree of ecosystem breakage.
- [x] If degree of breakage seems acceptable, draft nomination report for T-lang for FCP.
- [x] Determine hard error on Edition 2024+, or on all editions.

## Accompanying Reference update

- https://github.com/rust-lang/reference/pull/1966

[^non-lint]: The FCW was implemented as a *non-lint* warning (meaning it has no associated lint name, and you can't `#![deny(..)]` it) because spans coming from proc macros could not be distinguished from regular field access. This warning was also intentionally impossible to silence. See https://github.com/rust-lang/rust/pull/60186#issuecomment-485581694.

[issue-60210]: https://github.com/rust-lang/rust/issues/60210
</content>
</entry>
<entry>
<title>Make `LetChainsPolicy` public for rustfmt usage</title>
<updated>2025-09-06T16:01:31+00:00</updated>
<author>
<name>Moritz Hedtke</name>
<email>Moritz.Hedtke@t-online.de</email>
</author>
<published>2025-09-06T16:01:31+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=7fada167f9a3cfcfa35fbfc33a17b926f8ef3352'/>
<id>urn:sha1:7fada167f9a3cfcfa35fbfc33a17b926f8ef3352</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Remove the lifetime from `ExpTokenPair`/`SeqSep`.</title>
<updated>2025-08-24T22:02:52+00:00</updated>
<author>
<name>Nicholas Nethercote</name>
<email>n.nethercote@gmail.com</email>
</author>
<published>2025-08-24T21:29:54+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=a06c3887bd1ce85aeef491eef42b3a3d774413bc'/>
<id>urn:sha1:a06c3887bd1ce85aeef491eef42b3a3d774413bc</id>
<content type='text'>
`TokenKind` now impls `Copy`, so we can store it directly rather than a
reference.
</content>
</entry>
<entry>
<title>Rewrite the new attribute parser</title>
<updated>2025-08-22T06:38:37+00:00</updated>
<author>
<name>Jonathan Brouwer</name>
<email>jonathantbrouwer@gmail.com</email>
</author>
<published>2025-07-31T13:37:43+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=549314bdb7b7a3ac1313feea9283366f5115fca7'/>
<id>urn:sha1:549314bdb7b7a3ac1313feea9283366f5115fca7</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Auto merge of #145348 - nnethercote:parse_token_tree-speedup-for-uom, r=petrochenkov</title>
<updated>2025-08-20T09:01:41+00:00</updated>
<author>
<name>bors</name>
<email>bors@rust-lang.org</email>
</author>
<published>2025-08-20T09:01:41+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=bec747418c9955de4c3fd0aac4acb99206f00aa2'/>
<id>urn:sha1:bec747418c9955de4c3fd0aac4acb99206f00aa2</id>
<content type='text'>
Sometimes skip over tokens in `parse_token_tree`.

r? `@petrochenkov`
</content>
</entry>
<entry>
<title>Turn invalid index suffixes into hard errors</title>
<updated>2025-08-18T13:57:11+00:00</updated>
<author>
<name>Jieyou Xu</name>
<email>jieyouxu@outlook.com</email>
</author>
<published>2025-08-15T15:39:33+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=ddd99930f34b79f209c61cc25706a1dac1173762'/>
<id>urn:sha1:ddd99930f34b79f209c61cc25706a1dac1173762</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add FnContext in parser for diagnostic</title>
<updated>2025-08-14T13:31:47+00:00</updated>
<author>
<name>xizheyin</name>
<email>xizheyin@smail.nju.edu.cn</email>
</author>
<published>2025-08-14T13:30:52+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=3ce555f6313e78d3eed80fd22e22ef49f5bd3611'/>
<id>urn:sha1:3ce555f6313e78d3eed80fd22e22ef49f5bd3611</id>
<content type='text'>
Signed-off-by: xizheyin &lt;xizheyin@smail.nju.edu.cn&gt;
</content>
</entry>
<entry>
<title>Sometimes skip over tokens in `parse_token_tree`.</title>
<updated>2025-08-14T05:31:29+00:00</updated>
<author>
<name>Nicholas Nethercote</name>
<email>n.nethercote@gmail.com</email>
</author>
<published>2025-08-11T23:28:35+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=145b84721aae8e62d90b0fe40e8f796289ff7303'/>
<id>urn:sha1:145b84721aae8e62d90b0fe40e8f796289ff7303</id>
<content type='text'>
This sometimes avoids a lot of `bump` calls.
</content>
</entry>
<entry>
<title>remove `P`</title>
<updated>2025-08-09T07:47:01+00:00</updated>
<author>
<name>Deadbeef</name>
<email>ent3rm4n@gmail.com</email>
</author>
<published>2025-08-09T05:24:06+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=ad1113f87ef828b300ebb8fca397efd358580da3'/>
<id>urn:sha1:ad1113f87ef828b300ebb8fca397efd358580da3</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Auto merge of #143461 - folkertdev:cfg-select-builtin-macro, r=petrochenkov</title>
<updated>2025-07-13T18:34:13+00:00</updated>
<author>
<name>bors</name>
<email>bors@rust-lang.org</email>
</author>
<published>2025-07-13T18:34:13+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=e9182f195b8505c87c4bd055b9f6e114ccda0981'/>
<id>urn:sha1:e9182f195b8505c87c4bd055b9f6e114ccda0981</id>
<content type='text'>
make `cfg_select` a builtin macro

tracking issue: https://github.com/rust-lang/rust/issues/115585

This parses mostly the same as the `macro cfg_select` version, except:

1. wrapping in double brackets is no longer supported (or needed): `cfg_select {{ /* ... */ }}` is now rejected.
2. in an expression context, the rhs is no longer wrapped in a block, so that this now works:
  ```rust
  fn main() {
      println!(cfg_select! {
          unix =&gt; { "foo" }
          _ =&gt; { "bar" }
      });
  }
  ```
3. a single wildcard rule is now supported: `cfg_select { _ =&gt; 1 }` now works

I've also added an error if none of the rules evaluate to true, and warnings for any arms that follow the `_` wildcard rule.

cc `@traviscross` if I'm missing any feature that should/should not be included
r? `@petrochenkov` for the macro logic details
</content>
</entry>
</feed>
