Skip to content

validate #[link_name = "..."] & #[link(name = "...")] parameters#155817

Merged
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
folkertdev:link-name-null-empty
May 10, 2026
Merged

validate #[link_name = "..."] & #[link(name = "...")] parameters#155817
rust-bors[bot] merged 1 commit into
rust-lang:mainfrom
folkertdev:link-name-null-empty

Conversation

@folkertdev

@folkertdev folkertdev commented Apr 26, 2026

Copy link
Copy Markdown
Contributor

Reference:

fixes #155776
fixes #155484

specifically, do not allow NULL bytes and the empty string in #[link_name = "..."] and #[link(name = "...")].

Like some of the others I think this formally needs to be looked at by T-lang because these errors would not show up if not linking.

The LLVM erorr on #[linke_name = "\0"] is emitted here, it is not e.g. target-specific.

https://github.com/llvm/llvm-project/blob/d593279c0b2891f0b0c8af3f70a1a0383b4ad1b5/llvm/lib/IR/Value.cpp#L336-L342

On #[link(name = "")] we already error today. A NULL byte in #[link(name = "\0")] is caught by the linker (https://godbolt.org/z/vnz9sYbPs), using #[link_name = ""] makes LLVM generate a name (https://godbolt.org/z/1hWEo4cxf) which is not useful and likely to cause linker errors.

r? jdonszelmann

@rustbot

rustbot commented Apr 26, 2026

Copy link
Copy Markdown
Collaborator

Some changes occurred in compiler/rustc_attr_parsing

cc @jdonszelmann, @JonathanBrouwer

@rustbot rustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) 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 Apr 26, 2026
@folkertdev folkertdev changed the title validate #[link_name = "..."] parameter validate #[link_name = "..."] & #[link(name = "...")] parameters Apr 26, 2026

@mejrs mejrs left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

r? me

r=me on the implementation, pending lang approval

View changes since this review

Comment thread compiler/rustc_attr_parsing/src/attributes/link_attrs.rs Outdated
@rustbot rustbot assigned mejrs and unassigned jdonszelmann Apr 26, 2026
@rust-log-analyzer

This comment has been minimized.

@folkertdev folkertdev added I-lang-nominated Nominated for discussion during a lang team meeting. S-waiting-on-t-lang Status: Awaiting decision from T-lang labels Apr 26, 2026
@folkertdev folkertdev force-pushed the link-name-null-empty branch from b94ed3f to 2ffa233 Compare April 26, 2026 11:45
Comment on lines 12 to 13
#[link_name = "@GLIBC_2.2.5"]
pub safe fn exit_1(status: i32) -> !; //~ ERROR link name must be well-formed if link kind is `raw-dylib`

@folkertdev folkertdev Apr 26, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should move these errors to rustc_attr_parsing too, for consistency and so that the ranges can actually point to the attribute instead of the item.

That's not something T-lang needs to worry about though, so probably best done separately.

cc @usamoi (this test was added by #144221)

View changes since the review

@folkertdev folkertdev force-pushed the link-name-null-empty branch from 2ffa233 to 4338dfc Compare April 26, 2026 17:17
@rust-log-analyzer

This comment has been minimized.

@folkertdev folkertdev force-pushed the link-name-null-empty branch from 4338dfc to 5a5ae4c Compare April 26, 2026 17:26
@rust-log-analyzer

This comment has been minimized.

specifically, do not allow NULL bytes and the empty string
@folkertdev folkertdev force-pushed the link-name-null-empty branch from 5a5ae4c to c08b9ab Compare April 26, 2026 17:36
@traviscross traviscross added P-lang-drag-1 Lang team prioritization drag level 1. https://rust-lang.zulipchat.com/#narrow/channel/410516-t-lang I-lang-radar Items that are on lang's radar and will need eventual work or consideration. T-lang Relevant to the language team labels Apr 29, 2026
@traviscross

Copy link
Copy Markdown
Contributor

Thanks @folkertdev for cleaning these up.

@rfcbot fcp merge lang

@rust-rfcbot

rust-rfcbot commented Apr 29, 2026

Copy link
Copy Markdown
Collaborator

Team member @traviscross has proposed to merge this. The next step is review by the rest of the tagged team members:

No concerns currently listed.

Once a majority of reviewers approve (and at most 2 approvals are outstanding), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!

cc @rust-lang/lang-advisors: FCP proposed for lang, please feel free to register concerns.
See this document for info about what commands tagged team members can give me.

@rust-rfcbot rust-rfcbot added proposed-final-comment-period Proposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off. disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. final-comment-period In the final comment period and will be merged soon unless new substantive objections are raised. and removed proposed-final-comment-period Proposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off. labels Apr 29, 2026
@rust-rfcbot

Copy link
Copy Markdown
Collaborator

🔔 This is now entering its final comment period, as per the review above. 🔔

@folkertdev folkertdev removed the S-waiting-on-t-lang Status: Awaiting decision from T-lang label May 9, 2026
@folkertdev

Copy link
Copy Markdown
Contributor Author

@bors r=mejrs rollup

@rust-bors

rust-bors Bot commented May 9, 2026

Copy link
Copy Markdown
Contributor

📌 Commit c08b9ab has been approved by mejrs

It is now in the queue for this repository.

@rust-bors rust-bors Bot 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 May 9, 2026
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request May 9, 2026
…=mejrs

validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters

fixes rust-lang#155776
fixes rust-lang#155484

specifically, do not allow NULL bytes and the empty string in `#[link_name = "..."]` and `#[link(name = "...")]`.

Like some of the others I think this formally needs to be looked at by T-lang because these errors would not show up if not linking.

The LLVM erorr on `#[linke_name = "\0"]` is emitted here, it is not e.g. target-specific.

https://github.com/llvm/llvm-project/blob/d593279c0b2891f0b0c8af3f70a1a0383b4ad1b5/llvm/lib/IR/Value.cpp#L336-L342

On `#[link(name = "")]` we already error today. A NULL byte in `#[link(name = "\0")]` is caught by the linker (https://godbolt.org/z/vnz9sYbPs), using `#[link_name = ""]` makes LLVM generate a name (https://godbolt.org/z/1hWEo4cxf) which is not useful and likely to cause linker errors.

r? jdonszelmann
rust-bors Bot pushed a commit that referenced this pull request May 9, 2026
Rollup of 5 pull requests

Successful merges:

 - #148214 (Consider `Result<T, Uninhabited>` and `ControlFlow<Uninhabited, T>` to be equivalent to `T` for must use lint)
 - #149362 (Add Command::get_resolved_envs)
 - #155188 (Add regression test for issue 144329)
 - #155515 (error on empty `export_name`)
 - #155817 (validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters)
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request May 9, 2026
…=mejrs

validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters

fixes rust-lang#155776
fixes rust-lang#155484

specifically, do not allow NULL bytes and the empty string in `#[link_name = "..."]` and `#[link(name = "...")]`.

Like some of the others I think this formally needs to be looked at by T-lang because these errors would not show up if not linking.

The LLVM erorr on `#[linke_name = "\0"]` is emitted here, it is not e.g. target-specific.

https://github.com/llvm/llvm-project/blob/d593279c0b2891f0b0c8af3f70a1a0383b4ad1b5/llvm/lib/IR/Value.cpp#L336-L342

On `#[link(name = "")]` we already error today. A NULL byte in `#[link(name = "\0")]` is caught by the linker (https://godbolt.org/z/vnz9sYbPs), using `#[link_name = ""]` makes LLVM generate a name (https://godbolt.org/z/1hWEo4cxf) which is not useful and likely to cause linker errors.

r? jdonszelmann
JonathanBrouwer added a commit to JonathanBrouwer/rust that referenced this pull request May 9, 2026
…=mejrs

validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters

fixes rust-lang#155776
fixes rust-lang#155484

specifically, do not allow NULL bytes and the empty string in `#[link_name = "..."]` and `#[link(name = "...")]`.

Like some of the others I think this formally needs to be looked at by T-lang because these errors would not show up if not linking.

The LLVM erorr on `#[linke_name = "\0"]` is emitted here, it is not e.g. target-specific.

https://github.com/llvm/llvm-project/blob/d593279c0b2891f0b0c8af3f70a1a0383b4ad1b5/llvm/lib/IR/Value.cpp#L336-L342

On `#[link(name = "")]` we already error today. A NULL byte in `#[link(name = "\0")]` is caught by the linker (https://godbolt.org/z/vnz9sYbPs), using `#[link_name = ""]` makes LLVM generate a name (https://godbolt.org/z/1hWEo4cxf) which is not useful and likely to cause linker errors.

r? jdonszelmann
rust-bors Bot pushed a commit that referenced this pull request May 9, 2026
…uwer

Rollup of 10 pull requests

Successful merges:

 - #148214 (Consider `Result<T, Uninhabited>` and `ControlFlow<Uninhabited, T>` to be equivalent to `T` for must use lint)
 - #149362 (Add Command::get_resolved_envs)
 - #155705 (Add `str::word_to_titlecase()` to `alloc`)
 - #155970 (Add mention of sendfile(2) and splice(2) to fs::copy() documentation.)
 - #156006 (Update a bunch of bootstrap dependencies to remove windows-target)
 - #155188 (Add regression test for issue 144329)
 - #155515 (error on empty `export_name`)
 - #155817 (validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters)
 - #156107 (remove turbofish notation + use None / Some instead of Option:: (in match documentation))
 - #156133 (mark some panicking methods around Duration as track_caller)
rust-bors Bot pushed a commit that referenced this pull request May 10, 2026
Rollup of 11 pull requests

Successful merges:

 - #149362 (Add Command::get_resolved_envs)
 - #155705 (Add `str::word_to_titlecase()` to `alloc`)
 - #155970 (Add mention of sendfile(2) and splice(2) to fs::copy() documentation.)
 - #156006 (Update a bunch of bootstrap dependencies to remove windows-target)
 - #156169 (Change `SwitchInt` handling in dataflow analysis.)
 - #155188 (Add regression test for issue 144329)
 - #155515 (error on empty `export_name`)
 - #155817 (validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters)
 - #156107 (remove turbofish notation + use None / Some instead of Option:: (in match documentation))
 - #156133 (mark some panicking methods around Duration as track_caller)
 - #156363 (`rustc_attr_parsing`: add `AcceptContext::expect_string_literal`)
rust-bors Bot pushed a commit that referenced this pull request May 10, 2026
Rollup of 11 pull requests

Successful merges:

 - #149362 (Add Command::get_resolved_envs)
 - #155705 (Add `str::word_to_titlecase()` to `alloc`)
 - #155970 (Add mention of sendfile(2) and splice(2) to fs::copy() documentation.)
 - #156006 (Update a bunch of bootstrap dependencies to remove windows-target)
 - #156169 (Change `SwitchInt` handling in dataflow analysis.)
 - #155188 (Add regression test for issue 144329)
 - #155515 (error on empty `export_name`)
 - #155817 (validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters)
 - #156107 (remove turbofish notation + use None / Some instead of Option:: (in match documentation))
 - #156133 (mark some panicking methods around Duration as track_caller)
 - #156363 (`rustc_attr_parsing`: add `AcceptContext::expect_string_literal`)
rust-bors Bot pushed a commit that referenced this pull request May 10, 2026
Rollup of 11 pull requests

Successful merges:

 - #149362 (Add Command::get_resolved_envs)
 - #155705 (Add `str::word_to_titlecase()` to `alloc`)
 - #155970 (Add mention of sendfile(2) and splice(2) to fs::copy() documentation.)
 - #156006 (Update a bunch of bootstrap dependencies to remove windows-target)
 - #156169 (Change `SwitchInt` handling in dataflow analysis.)
 - #155188 (Add regression test for issue 144329)
 - #155515 (error on empty `export_name`)
 - #155817 (validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters)
 - #156107 (remove turbofish notation + use None / Some instead of Option:: (in match documentation))
 - #156133 (mark some panicking methods around Duration as track_caller)
 - #156363 (`rustc_attr_parsing`: add `AcceptContext::expect_string_literal`)
@rust-bors rust-bors Bot merged commit 99abbd6 into rust-lang:main May 10, 2026
11 checks passed
@rustbot rustbot added this to the 1.97.0 milestone May 10, 2026
rust-timer added a commit that referenced this pull request May 10, 2026
Rollup merge of #155817 - folkertdev:link-name-null-empty, r=mejrs

validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters

fixes #155776
fixes #155484

specifically, do not allow NULL bytes and the empty string in `#[link_name = "..."]` and `#[link(name = "...")]`.

Like some of the others I think this formally needs to be looked at by T-lang because these errors would not show up if not linking.

The LLVM erorr on `#[linke_name = "\0"]` is emitted here, it is not e.g. target-specific.

https://github.com/llvm/llvm-project/blob/d593279c0b2891f0b0c8af3f70a1a0383b4ad1b5/llvm/lib/IR/Value.cpp#L336-L342

On `#[link(name = "")]` we already error today. A NULL byte in `#[link(name = "\0")]` is caught by the linker (https://godbolt.org/z/vnz9sYbPs), using `#[link_name = ""]` makes LLVM generate a name (https://godbolt.org/z/1hWEo4cxf) which is not useful and likely to cause linker errors.

r? jdonszelmann
@traviscross traviscross added needs-reference-pr This language change needs an approved Reference PR to proceed. missed-reference-pr This language change needed a Reference PR and was merged without it. labels May 26, 2026
pull Bot pushed a commit to Arstman/reference that referenced this pull request May 26, 2026
rust-lang/rust#155817 added some restrictions on
the symbol name in the `link_name` attribute. The name cannot be empty
or contain null bytes.
@traviscross traviscross added the has-reference-pr This language change has an approved Reference PR. label Jun 16, 2026
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jul 10, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [rust](https://github.com/rust-lang/rust) | minor | `1.96.1` → `1.97.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>rust-lang/rust (rust)</summary>

### [`v1.97.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1970-2026-07-09)

[Compare Source](rust-lang/rust@1.96.1...1.97.0)

\==========================

<a id="1.97.0-Language"></a>

## Language

- [Consider `Result<T, Uninhabited>` and `ControlFlow<Uninhabited, T>` to be equivalent to `T` for must use lint](rust-lang/rust#148214)
- [Add allow-by-default `dead_code_pub_in_binary` lint for unused pub items in binary crates](rust-lang/rust#149509)
- [Stabilize the `div32`, `lam-bh`, `lamcas`, `ld-seq-sa` and `scq` target features](rust-lang/rust#154510)
- [Stabilize `cfg(target_has_atomic_primitive_alignment)`](rust-lang/rust#155006)
- [Allow trailing `self` in imports in more cases](rust-lang/rust#155137)

<a id="1.97.0-Platform-Support"></a>

## Platform Support

- [nvptx64-nvidia-cuda: drop support for old architectures and old ISAs](rust-lang/rust#152443)

Refer to Rust's [platform support page][platform-support-doc]
for more information on Rust's tiered platform support.

[platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html

<a id="1.97.0-Stabilized-APIs"></a>

## Stabilized APIs

- [`Default for RepeatN`](https://doc.rust-lang.org/stable/std/iter/struct.RepeatN.html#impl-Default-for-RepeatN%3CA%3E)
- [`Copy for ffi::FromBytesUntilNulError`](https://doc.rust-lang.org/stable/std/ffi/struct.FromBytesUntilNulError.html#impl-Copy-for-FromBytesUntilNulError)
- [`Send for std::fs::File` on UEFI](rust-lang/rust#154003)
- [`<{integer}>::isolate_highest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_highest_one)
- [`<{integer}>::isolate_lowest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_lowest_one)
- [`<{integer}>::highest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.highest_one)
- [`<{integer}>::lowest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.lowest_one)
- [`<{integer}>::bit_width`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.bit_width)
- [`NonZero<{integer}>::isolate_highest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_highest_one)
- [`NonZero<{integer}>::isolate_lowest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_lowest_one)
- [`NonZero<{integer}>::highest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.highest_one)
- [`NonZero<{integer}>::lowest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.lowest_one)
- [`NonZero<{integer}>::bit_width`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.bit_width)

These previously stable APIs are now stable in const contexts:

- [`char::is_control`](https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_control)

<a id="1.97.0-Cargo"></a>

## Cargo

- [Stabilize `build.warnings` config.](rust-lang/cargo#16796) This controls how lint warnings from local packages are treated. Useful for enforcing a warning-free build in CI, replacing `-Dwarnings`. [docs](https://doc.rust-lang.org/nightly/cargo/reference/config.html#buildwarnings)
- [Stabilize `resolver.lockfile-path` config.](rust-lang/cargo#16694) This allows specifying the path to the lockfile to use when resolving dependencies. Useful when working with read-only source directories. [docs](https://doc.rust-lang.org/nightly/cargo/reference/config.html#resolverlockfile-path)
- [cargo-clean: Error when `--target-dir` doesn't look like a Cargo target directory.](rust-lang/cargo#16712) This prevents accidental deletion of non-target directories.
- [Add `-m` shorthand for `--manifest-path`](rust-lang/cargo#16858)
- [Remove `curl` dependency from `crates-io` crate](rust-lang/cargo#16936)

<a id="1.97.0-Rustdoc"></a>

## Rustdoc

- [Stabilize `--emit` flag](rust-lang/rust#146220)
- [Stabilize `--remap-path-prefix`](rust-lang/rust#155307)

<a id="1.97.0-Compatibility-Notes"></a>

## Compatibility Notes

- [Emit a future-compatibility warning when relying on `f32: From<{float}>` to constrain `{float}`](rust-lang/rust#139087)
- [Rust will use the v0 symbol mangling scheme by default.](rust-lang/rust#151994) This may cause some tools (such as debuggers or profilers, especially with old versions) to fail to demangle symbols emitted by Rust. It may also cause the formatting of text in backtraces to change.
- [Prevent deref coercions in `pin!`, in order to prevent unsoundness.](rust-lang/rust#153457) The most likely case where this might impact users is: writing `pin!(x)` where `x` has type `&mut T` will now always correctly produce a value of type `Pin<&mut &mut T>`, instead of sometimes allowing a coercion that produces a value of type `Pin<&mut T>`. This coercion was previously incorrectly allowed since Rust 1.88.0.
- [Deprecate `std::char` constants and functions](rust-lang/rust#153873)
- [Warn on linker output by default](rust-lang/rust#153968)
- [Remove hidden `f64` methods which have been deprecated since 1.0](rust-lang/rust#153975)
- [report the `varargs_without_pattern` lint in deps](rust-lang/rust#154599)
- [Forbid passing generic arguments to module path segments even if the module reexports a generic enum variant](rust-lang/rust#154971)
- [Error on invalid macho `link_section` specifier](rust-lang/rust#155065)
- The encoding of certain `enum`s [have changed](rust-lang/rust#155473).  This is not a breaking change, as it only applies to `enum`s without layout guarantees, but is noted here as we've seen people impacted from having made assumptions about the layout algorithm.
- [Error on `#[export_name = "..."]` where the name is empty](rust-lang/rust#155515)
- [Syntactically reject tuple index shorthands in struct patterns](rust-lang/rust#155698)
- [validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters](rust-lang/rust#155817)
- On Windows, after calling `shutdown` on a socket to shut down the write side, attempting to write to the socket will now produce a `BrokenPipe` error rather than `Other`. [Map `WSAESHUTDOWN` to `io::ErrorKind::BrokenPipe`](rust-lang/rust#156063)

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNTYuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI1Ni4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
eleboucher pushed a commit to eleboucher/towonel that referenced this pull request Jul 10, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [rust](https://github.com/rust-lang/rust) |  | minor | `1.96.1` → `1.97.0` |
| rust | stage | minor | `1.96-bookworm` → `1.97-bookworm` |

---

### Release Notes

<details>
<summary>rust-lang/rust (rust)</summary>

### [`v1.97.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1970-2026-07-09)

[Compare Source](rust-lang/rust@1.96.1...1.97.0)

\==========================

<a id="1.97.0-Language"></a>

## Language

- [Consider `Result<T, Uninhabited>` and `ControlFlow<Uninhabited, T>` to be equivalent to `T` for must use lint](rust-lang/rust#148214)
- [Add allow-by-default `dead_code_pub_in_binary` lint for unused pub items in binary crates](rust-lang/rust#149509)
- [Stabilize the `div32`, `lam-bh`, `lamcas`, `ld-seq-sa` and `scq` target features](rust-lang/rust#154510)
- [Stabilize `cfg(target_has_atomic_primitive_alignment)`](rust-lang/rust#155006)
- [Allow trailing `self` in imports in more cases](rust-lang/rust#155137)

<a id="1.97.0-Platform-Support"></a>

## Platform Support

- [nvptx64-nvidia-cuda: drop support for old architectures and old ISAs](rust-lang/rust#152443)

Refer to Rust's [platform support page][platform-support-doc]
for more information on Rust's tiered platform support.

[platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html

<a id="1.97.0-Stabilized-APIs"></a>

## Stabilized APIs

- [`Default for RepeatN`](https://doc.rust-lang.org/stable/std/iter/struct.RepeatN.html#impl-Default-for-RepeatN%3CA%3E)
- [`Copy for ffi::FromBytesUntilNulError`](https://doc.rust-lang.org/stable/std/ffi/struct.FromBytesUntilNulError.html#impl-Copy-for-FromBytesUntilNulError)
- [`Send for std::fs::File` on UEFI](rust-lang/rust#154003)
- [`<{integer}>::isolate_highest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_highest_one)
- [`<{integer}>::isolate_lowest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_lowest_one)
- [`<{integer}>::highest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.highest_one)
- [`<{integer}>::lowest_one`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.lowest_one)
- [`<{integer}>::bit_width`](https://doc.rust-lang.org/stable/std/primitive.u32.html#method.bit_width)
- [`NonZero<{integer}>::isolate_highest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_highest_one)
- [`NonZero<{integer}>::isolate_lowest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_lowest_one)
- [`NonZero<{integer}>::highest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.highest_one)
- [`NonZero<{integer}>::lowest_one`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.lowest_one)
- [`NonZero<{integer}>::bit_width`](https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.bit_width)

These previously stable APIs are now stable in const contexts:

- [`char::is_control`](https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_control)

<a id="1.97.0-Cargo"></a>

## Cargo

- [Stabilize `build.warnings` config.](rust-lang/cargo#16796) This controls how lint warnings from local packages are treated. Useful for enforcing a warning-free build in CI, replacing `-Dwarnings`. [docs](https://doc.rust-lang.org/nightly/cargo/reference/config.html#buildwarnings)
- [Stabilize `resolver.lockfile-path` config.](rust-lang/cargo#16694) This allows specifying the path to the lockfile to use when resolving dependencies. Useful when working with read-only source directories. [docs](https://doc.rust-lang.org/nightly/cargo/reference/config.html#resolverlockfile-path)
- [cargo-clean: Error when `--target-dir` doesn't look like a Cargo target directory.](rust-lang/cargo#16712) This prevents accidental deletion of non-target directories.
- [Add `-m` shorthand for `--manifest-path`](rust-lang/cargo#16858)
- [Remove `curl` dependency from `crates-io` crate](rust-lang/cargo#16936)

<a id="1.97.0-Rustdoc"></a>

## Rustdoc

- [Stabilize `--emit` flag](rust-lang/rust#146220)
- [Stabilize `--remap-path-prefix`](rust-lang/rust#155307)

<a id="1.97.0-Compatibility-Notes"></a>

## Compatibility Notes

- [Emit a future-compatibility warning when relying on `f32: From<{float}>` to constrain `{float}`](rust-lang/rust#139087)
- [Rust will use the v0 symbol mangling scheme by default.](rust-lang/rust#151994) This may cause some tools (such as debuggers or profilers, especially with old versions) to fail to demangle symbols emitted by Rust. It may also cause the formatting of text in backtraces to change.
- [Prevent deref coercions in `pin!`, in order to prevent unsoundness.](rust-lang/rust#153457) The most likely case where this might impact users is: writing `pin!(x)` where `x` has type `&mut T` will now always correctly produce a value of type `Pin<&mut &mut T>`, instead of sometimes allowing a coercion that produces a value of type `Pin<&mut T>`. This coercion was previously incorrectly allowed since Rust 1.88.0.
- [Deprecate `std::char` constants and functions](rust-lang/rust#153873)
- [Warn on linker output by default](rust-lang/rust#153968)
- [Remove hidden `f64` methods which have been deprecated since 1.0](rust-lang/rust#153975)
- [report the `varargs_without_pattern` lint in deps](rust-lang/rust#154599)
- [Forbid passing generic arguments to module path segments even if the module reexports a generic enum variant](rust-lang/rust#154971)
- [Error on invalid macho `link_section` specifier](rust-lang/rust#155065)
- The encoding of certain `enum`s [have changed](rust-lang/rust#155473).  This is not a breaking change, as it only applies to `enum`s without layout guarantees, but is noted here as we've seen people impacted from having made assumptions about the layout algorithm.
- [Error on `#[export_name = "..."]` where the name is empty](rust-lang/rust#155515)
- [Syntactically reject tuple index shorthands in struct patterns](rust-lang/rust#155698)
- [validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters](rust-lang/rust#155817)
- On Windows, after calling `shutdown` on a socket to shut down the write side, attempting to write to the socket will now produce a `BrokenPipe` error rather than `Other`. [Map `WSAESHUTDOWN` to `io::ErrorKind::BrokenPipe`](rust-lang/rust#156063)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDEuMSIsInVwZGF0ZWRJblZlciI6IjQzLjEwMS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZS9jb250YWluZXIiLCJ0eXBlL21pbm9yIl19-->

Reviewed-on: https://codeberg.org/towonel/towonel/pulls/58
wip-sync pushed a commit to NetBSD/pkgsrc-wip that referenced this pull request Jul 11, 2026
Package updates relative to rust196:
 * Version & checksum changes
 * Applied patches to updated vendored crates

Upstream changes:

Version 1.97.0 (2026-07-09)
==========================

Language
--------
- [Consider `Result<T, Uninhabited>` and `ControlFlow<Uninhabited,
  T>` to be equivalent to `T` for must use lint]
  (rust-lang/rust#148214)
- [Add allow-by-default `dead_code_pub_in_binary` lint for unused
  pub items in binary crates] (rust-lang/rust#149509)
- [Stabilize the `div32`, `lam-bh`, `lamcas`, `ld-seq-sa` and `scq`
  target features] (rust-lang/rust#154510)
- [Stabilize `cfg(target_has_atomic_primitive_alignment)`]
  (rust-lang/rust#155006)
- [Allow trailing `self` in imports in more cases]
  (rust-lang/rust#155137)

Platform Support
----------------
- [nvptx64-nvidia-cuda: drop support for old architectures and old ISAs]
  (rust-lang/rust#152443)

Refer to Rust's [platform support page][platform-support-doc]
for more information on Rust's tiered platform support.

[platform-support-doc]: https://doc.rust-lang.org/rustc/platform-support.html

Stabilized APIs
---------------

- [`Default for RepeatN`]
  (https://doc.rust-lang.org/stable/std/iter/struct.RepeatN.html#impl-Default-for-RepeatN%3CA%3E)
- [`Copy for ffi::FromBytesUntilNulError`]
  (https://doc.rust-lang.org/stable/std/ffi/struct.FromBytesUntilNulError.html#impl-Copy-for-FromBytesUntilNulError)
- [`Send for std::fs::File` on UEFI]
  (rust-lang/rust#154003)
- [`<{integer}>::isolate_highest_one`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_highest_one)
- [`<{integer}>::isolate_lowest_one`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.isolate_lowest_one)
- [`NonZero<{integer}>::isolate_highest_one`]
  (https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_highest_one)
- [`NonZero<{integer}>::isolate_lowest_one`]
  (https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.isolate_lowest_one)
- [`<{integer}>::bit_width`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.bit_width)
- [`<{integer}>::lowest_one`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.lowest_one)
- [`<{integer}>::highest_one`]
  (https://doc.rust-lang.org/stable/std/primitive.u32.html#method.highest_one)
- [`NonZero<{integer}>::bit_width`]
  (https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.bit_width)
- [`NonZero<{integer}>::highest_one`]
  (https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.highest_one)
- [`NonZero<{integer}>::lowest_one`]
  (https://doc.rust-lang.org/stable/std/num/struct.NonZero.html#method.lowest_one)

These previously stable APIs are now stable in const contexts:

- [`char::is_control`]
  (https://doc.rust-lang.org/stable/std/primitive.char.html#method.is_control)

Cargo
-----
- [Stabilize `build.warnings` config.]
  (rust-lang/cargo#16796) This controls
  how lint warnings from local packages are treated. Useful for
  enforcing a warning-free build in CI, replacing `-Dwarnings`.
  [docs]
  (https://doc.rust-lang.org/nightly/cargo/reference/config.html#buildwarnings)
- [Stabilize `resolver.lockfile-path` config.]
  (rust-lang/cargo#16694) This allows
  specifying the path to the lockfile to use when resolving
  dependencies. Useful when working with read-only source directories.  [docs]
  (https://doc.rust-lang.org/nightly/cargo/reference/config.html#resolverlockfile-path)
- [cargo-clean: Error when `--target-dir` doesn't look like a Cargo
  target directory.] (rust-lang/cargo#16712)
  This prevents accidental deletion of non-target directories.
- [Add `-m` shorthand for `--manifest-path`]
  (rust-lang/cargo#16858)
- [Remove `curl` dependency from `crates-io` crate]
  (rust-lang/cargo#16936)

Rustdoc
-----
- [Stabilize `--emit` flag]
  (rust-lang/rust#146220)
- [Stabilize `--remap-path-prefix`]
  (rust-lang/rust#155307)

Compatibility Notes
-------------------
- [Emit a future-compatibility warning when relying on `f32:
  From<{float}>` to constrain `{float}`]
  (rust-lang/rust#139087)
- [Rust will use the v0 symbol mangling scheme by default.]
  (rust-lang/rust#151994) This may cause
  some tools (such as debuggers or profilers, especially with old
  versions) to fail to demangle symbols emitted by Rust. It may
  also cause the formatting of text in backtraces to change.
- [Prevent deref coercions in `pin!`, in order to prevent unsoundness.]
  (rust-lang/rust#153457) The most likely
  case where this might impact users is: writing `pin!(x)` where
  `x` has type `&mut T` will now always correctly produce a value
  of type `Pin<&mut &mut T>`, instead of sometimes allowing a
  coercion that produces a value of type `Pin<&mut T>`. This coercion
  was previously incorrectly allowed since Rust 1.88.0.
- [Deprecate `std::char` constants and functions]
  (rust-lang/rust#153873)
- [Warn on linker output by default]
  (rust-lang/rust#153968)
- [Remove hidden `f64` methods which have been deprecated since 1.0]
  (rust-lang/rust#153975)
- [report the `varargs_without_pattern` lint in deps]
  (rust-lang/rust#154599)
- [Forbid passing generic arguments to module path segments even
  if the module reexports a generic enum variant]
  (rust-lang/rust#154971)
- [Error on invalid macho `link_section` specifier]
  (rust-lang/rust#155065)
- The encoding of certain `enum`s [have changed]
  (rust-lang/rust#155473).  This is not a
  breaking change, as it only applies to `enum`s without layout
  guarantees, but is noted here as we've seen people impacted from
  having made assumptions about the layout algorithm.
- [Error on `#[export_name = "..."]` where the name is empty]
  (rust-lang/rust#155515)
- [Syntactically reject tuple index shorthands in struct patterns]
  (rust-lang/rust#155698)
- [validate `#[link_name = "..."]` & `#[link(name = "...")]` parameters]
  (rust-lang/rust#155817)
- On Windows, after calling `shutdown` on a socket to shut down
  the write side, attempting to write to the socket will now produce
  a `BrokenPipe` error rather than `Other`. [Map `WSAESHUTDOWN` to
  `io::ErrorKind::BrokenPipe`]
  (rust-lang/rust#156063)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributes Area: Attributes (`#[…]`, `#![…]`) disposition-merge This issue / PR is in PFCP or FCP with a disposition to merge it. finished-final-comment-period The final comment period is finished for this PR / Issue. has-reference-pr This language change has an approved Reference PR. I-lang-radar Items that are on lang's radar and will need eventual work or consideration. missed-reference-pr This language change needed a Reference PR and was merged without it. needs-reference-pr This language change needs an approved Reference PR to proceed. 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. T-lang Relevant to the language team to-announce Announce this issue on triage meeting

Projects

None yet

Development

Successfully merging this pull request may close these issues.

special link_name confuses LLVM [ICE]: Result::unwrap() on an Err value: NulError(0, [0])

8 participants