Skip to content

De-duplicate and improve definition of core::ffi::c_char#132975

Merged
bors merged 3 commits intorust-lang:masterfrom
arichardson:ffi-c-char
Dec 11, 2024
Merged

De-duplicate and improve definition of core::ffi::c_char#132975
bors merged 3 commits intorust-lang:masterfrom
arichardson:ffi-c-char

Conversation

@arichardson
Copy link
Contributor

@arichardson arichardson commented Nov 13, 2024

Instead of having a list of unsigned char targets for each OS, follow the logic Clang uses and instead set the value based on architecture with a special case for Darwin and Windows operating systems. This makes it easier to support new operating systems targeting Arm/AArch64 without having to modify this config statement for each new OS. The new list does not quite match Clang since I noticed a few bugs in the Clang implementation (llvm/llvm-project#115957).

Fixes #129945
Closes #131319

@rustbot
Copy link
Collaborator

rustbot commented Nov 13, 2024

Thanks for the pull request, and welcome! The Rust team is excited to review your changes, and you should hear from @cuviper (or someone else) some time within the next two weeks.

Please see the contribution instructions for more information. Namely, in order to ensure the minimum review times lag, PR authors and assigned reviewers should ensure that the review label (S-waiting-on-review and S-waiting-on-author) stays updated, invoking these commands when appropriate:

  • @rustbot author: the review is finished, PR author should check the comments and take action accordingly
  • @rustbot review: the author is ready for a review, this PR will be queued again in the reviewer's queue

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Nov 13, 2024
@arichardson
Copy link
Contributor Author

r? @maurer @joshtriplett

@rustbot
Copy link
Collaborator

rustbot commented Nov 13, 2024

Failed to set assignee to maurer: invalid assignee

Note: Only org members with at least the repository "read" role, users with write permissions, or people who have commented on the PR may be assigned.

@beetrees
Copy link
Contributor

I think r? @joshtriplett should work.

@rustbot rustbot assigned joshtriplett and unassigned cuviper Nov 13, 2024
Copy link
Contributor

@maurer maurer left a comment

Choose a reason for hiding this comment

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

Some OSes are no longer conditioned on, for example, os=nto arch=aarch64 or os=l4re, arch=x86_64 are missing.

I didn't manually verify everything, but at least l4re and x86_64 just got flipped from u8, which it appears to have been manually set to, to i8.

Can we get a summary of what changed in terms of supported target triples? I would expect disagreements with clang to be rare, but this patch looks like it accidentally changes obscure targets at a minimum. It might also be clearer what changed if we didn't have the 4-branch if statement for 2 results.

@maurer
Copy link
Contributor

maurer commented Nov 13, 2024

I'm pretty sure this still changes l4re-x86_64 from unsigned to signed.

@beetrees
Copy link
Contributor

As Apple and Windows targets always use signed char, you could simplify the cfg statement further to cfg(all(not(any(windows, target_vendor = "apple")), any(/* target_arch/target_os that use unsigned char */)))

@arichardson
Copy link
Contributor Author

arichardson commented Nov 13, 2024

I'm pretty sure this still changes l4re-x86_64 from unsigned to signed.

I'm trying to figure out if that value is intentional or not. It dates back to 2cf0a4a, but I can't see anything in L4RE that changes the default - maybe this was actually indented to set it for aarch64?

@arichardson
Copy link
Contributor Author

Looks like l4re should be setting this for all architectures, I spotted -funsigned-char in https://github.com/kernkonzept/mk/blob/926afa93e32e64dbdb33cf9ae724924ee1fb16e0/tool/kconfig/Makefile#L550, so that suggests it's the case for all targets. Will update to handle that.

@arichardson arichardson force-pushed the ffi-c-char branch 2 times, most recently from c19462d to 4d8abde Compare November 13, 2024 19:39
@joshtriplett
Copy link
Member

r? libs-api

@rustbot rustbot added the T-libs-api Relevant to the library API team, which will review and decide on the PR/issue. label Nov 14, 2024
@rustbot rustbot assigned BurntSushi and unassigned joshtriplett Nov 14, 2024
@arichardson arichardson requested a review from maurer November 14, 2024 00:44
@tgross35
Copy link
Contributor

tgross35 commented Nov 15, 2024

See also an open issue about this #129945 and an open PR that this would supersede #131319 (cc @taiki-e)

I also wrote an issue requesting a test of our types against Clang at some point #133058.

@arichardson
Copy link
Contributor Author

I have validated the new c_char definitions against my build of clang that has fixes for MSP430, Xtensa (although printing the builtin defines fails with error: unknown target triple 'xtensa-unknown-none-elf'), and CSKY (which fails with version 'abiv2' in target triple 'csky-unknown-linux-gnuabiv2' is invalid).

Unlike #131319 this PR does not have links to all the ABI docs, but it does have a correct definition for l4re (which clang does not support and treats as unknown OS).

@taiki-e
Copy link
Member

taiki-e commented Nov 19, 2024

As for L4Re:
I think L4Re code you are linking is config when building kernel. IIUC, userland uses signed for x86_64 and unsigned for aarch64 by default (i.e., same as ELF ABI's default).

$ ./toolchain-l4re-x86_64-gcc-14/bin/x86_64-l4re-gcc -E -dM -x c /dev/null | grep -F __CHAR_
#define __CHAR_BIT__ 8

$ ./toolchain-l4re-arm64-gcc-14/bin/aarch64-l4re-gcc -E -dM -x c /dev/null | grep -F __CHAR_
#define __CHAR_BIT__ 8
#define __CHAR_UNSIGNED__ 1

({x86_64,aarch64}-l4re-gcc are from https://l4re.org/download/snapshots/toolchain/.)


As for Xtensa:
Section 2.17.1 "Data Types and Alignment" of Xtensa LX Microprocessor Overview handbook https://loboris.eu/ESP32/Xtensa_lx%20Overview%20handbook.pdf says "char type is unsigned by default".

However, it appears that Xtensa has multiple ABIs. (Section 1.4 "Calling convention" of Overview of Xtensa ISA https://dl.espressif.com/github_assets/espressif/xtensa-isa-doc/releases/download/latest/Xtensa.pdf)
(I have not checked whether the defaults are consistent among those ABIs or not -- this is why my PR has done nothing about Xtensa.)

arichardson added a commit to arichardson/rust that referenced this pull request Dec 4, 2024
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
@arichardson
Copy link
Contributor Author

Rebased and fixed the l4re issue.

As for L4Re: I think L4Re code you are linking is config when building kernel. IIUC, userland uses signed for x86_64 and unsigned for aarch64 by default (i.e., same as ELF ABI's default).

$ ./toolchain-l4re-x86_64-gcc-14/bin/x86_64-l4re-gcc -E -dM -x c /dev/null | grep -F __CHAR_
#define __CHAR_BIT__ 8

$ ./toolchain-l4re-arm64-gcc-14/bin/aarch64-l4re-gcc -E -dM -x c /dev/null | grep -F __CHAR_
#define __CHAR_BIT__ 8
#define __CHAR_UNSIGNED__ 1

({x86_64,aarch64}-l4re-gcc are from https://l4re.org/download/snapshots/toolchain/.)

Thanks for checking this, I've updated the change to remove l4re from the list. I've done this as a separate commit in case this needs to be reverted in the future.

As for Xtensa: Section 2.17.1 "Data Types and Alignment" of Xtensa LX Microprocessor Overview handbook https://loboris.eu/ESP32/Xtensa_lx%20Overview%20handbook.pdf says "char type is unsigned by default".

However, it appears that Xtensa has multiple ABIs. (Section 1.4 "Calling convention" of Overview of Xtensa ISA https://dl.espressif.com/github_assets/espressif/xtensa-isa-doc/releases/download/latest/Xtensa.pdf) (I have not checked whether the defaults are consistent among those ABIs or not -- this is why my PR has done nothing about Xtensa.)

Regarding Xtensa, my Clang change to make it unsigned by default was approved by Xtensa developers and has been merged now: llvm/llvm-project#115967.

matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Jan 28, 2025
Update comments and sort target_arch in c_char_definition

Follow-up to rust-lang#132975.

- Clang's wrong default on MSP430 has been fixed in llvm/llvm-project#115964, and will be included in LLVM 20, which will be used soon.
- Add a reference on Xtensa's default (from rust-lang#132975 (comment)).
- Fix link for Windows's default.
- Add a link to the discussion on L4Re (rust-lang#132975 (comment))
- Sort `target_arch`. (now match with `target_arch`s in comments)

r? `@tgross35`
rust-timer added a commit to rust-lang-ci/rust that referenced this pull request Jan 28, 2025
Rollup merge of rust-lang#136173 - taiki-e:c-char, r=tgross35

Update comments and sort target_arch in c_char_definition

Follow-up to rust-lang#132975.

- Clang's wrong default on MSP430 has been fixed in llvm/llvm-project#115964, and will be included in LLVM 20, which will be used soon.
- Add a reference on Xtensa's default (from rust-lang#132975 (comment)).
- Fix link for Windows's default.
- Add a link to the discussion on L4Re (rust-lang#132975 (comment))
- Sort `target_arch`. (now match with `target_arch`s in comments)

r? `@tgross35`
github-actions bot pushed a commit to tautschnig/verify-rust-std that referenced this pull request Feb 20, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to tautschnig/verify-rust-std that referenced this pull request Feb 20, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to carolynzech/rust that referenced this pull request Feb 20, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to model-checking/verify-rust-std that referenced this pull request Feb 20, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to thanhnguyen-aws/verify-rust-std that referenced this pull request Feb 21, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to thanhnguyen-aws/verify-rust-std that referenced this pull request Feb 21, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to model-checking/verify-rust-std that referenced this pull request Feb 22, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to carolynzech/rust that referenced this pull request Feb 22, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to tautschnig/verify-rust-std that referenced this pull request Feb 22, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to thanhnguyen-aws/verify-rust-std that referenced this pull request Feb 22, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
wip-sync pushed a commit to NetBSD/pkgsrc-wip that referenced this pull request Feb 23, 2025
Pkgsrc changes relative to rust184:

 * patch reorganization to deal with new version
   of upstream vendored crates, checksum updates.

Version 1.85.0 (2025-02-20)
==========================

Language
--------
- [The 2024 Edition is now stable.]
  (rust-lang/rust#133349)
  See [the edition guide]
  (https://doc.rust-lang.org/nightly/edition-guide/rust-2024/index.html)
  for more details.
- [Stabilize async closures]
  (rust-lang/rust#132706)
  See [RFC 3668]
  (https://rust-lang.github.io/rfcs/3668-async-closures.html) for more details.
- [Stabilize `#[diagnostic::do_not_recommend]`]
  (rust-lang/rust#132056)
- [Add `unpredictable_function_pointer_comparisons` lint to warn
  against function pointer comparisons]
  (rust-lang/rust#118833)
- [Lint on combining `#[no_mangle]` and `#[export_name]` attributes.]
  (rust-lang/rust#131558)

Compiler
--------
- [The unstable flag `-Zpolymorphize` has been removed]
  (rust-lang/rust#133883), see
  rust-lang/compiler-team#810 for some
  background.

Platform Support
----------------
- [Promote `powerpc64le-unknown-linux-musl` to tier 2 with host tools]
  (rust-lang/rust#133801)

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

Libraries
---------
- [Panics in the standard library now have a leading `library/` in their path]
  (rust-lang/rust#132390)
- [`std::env::home_dir()` on Windows now ignores the non-standard
  `$HOME` environment variable]
  (rust-lang/rust#132515)

  It will be un-deprecated in a subsequent release.
- [Add `AsyncFn*` to the prelude in all editions.]
  (rust-lang/rust#132611)

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

- [`BuildHasherDefault::new`]
  (https://doc.rust-lang.org/stable/std/hash/struct.BuildHasherDefault.html#method.new)
- [`ptr::fn_addr_eq`]
  (https://doc.rust-lang.org/std/ptr/fn.fn_addr_eq.html)
- [`io::ErrorKind::QuotaExceeded`]
  (https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html#variant.QuotaExceeded)
- [`io::ErrorKind::CrossesDevices`]
  (https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html#variant.CrossesDevices)
- [`{float}::midpoint`]
  (https://doc.rust-lang.org/core/primitive.f32.html#method.midpoint)
- [Unsigned `{integer}::midpoint`]
  (https://doc.rust-lang.org/std/primitive.u64.html#method.midpoint)
- [`NonZeroU*::midpoint`]
  (https://doc.rust-lang.org/std/num/type.NonZeroU32.html#method.midpoint)
- [impl `std::iter::Extend` for tuples with arity 1 through 12]
  (https://doc.rust-lang.org/stable/std/iter/trait.Extend.html#impl-Extend%3C(A,)%3E-for-(EA,))
- [`FromIterator<(A, ...)>` for tuples with arity 1 through 12]
  (https://doc.rust-lang.org/stable/std/iter/trait.FromIterator.html#impl-FromIterator%3C(EA,)%3E-for-(A,))
- [`std::task::Waker::noop`]
  (https://doc.rust-lang.org/stable/std/task/struct.Waker.html#method.noop)

These APIs are now stable in const contexts:

- [`mem::size_of_val`]
  (https://doc.rust-lang.org/stable/std/mem/fn.size_of_val.html)
- [`mem::align_of_val`]
  (https://doc.rust-lang.org/stable/std/mem/fn.align_of_val.html)
- [`Layout::for_value`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.for_value)
- [`Layout::align_to`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.align_to)
- [`Layout::pad_to_align`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.pad_to_align)
- [`Layout::extend`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.extend)
- [`Layout::array`]
  (https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.array)
- [`std::mem::swap`]
  (https://doc.rust-lang.org/stable/std/mem/fn.swap.html)
- [`std::ptr::swap`]
  (https://doc.rust-lang.org/stable/std/ptr/fn.swap.html)
- [`NonNull::new`]
  (https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.new)
- [`HashMap::with_hasher`]
  (https://doc.rust-lang.org/stable/std/collections/struct.HashMap.html#method.with_hasher)
- [`HashSet::with_hasher`]
  (https://doc.rust-lang.org/stable/std/collections/struct.HashSet.html#method.with_hasher)
- [`BuildHasherDefault::new`]
  (https://doc.rust-lang.org/stable/std/hash/struct.BuildHasherDefault.html#method.new)
- [`<float>::recip`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.recip)
- [`<float>::to_degrees`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.to_degrees)
- [`<float>::to_radians`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.to_radians)
- [`<float>::max`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.max)
- [`<float>::min`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.min)
- [`<float>::clamp`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.clamp)
- [`<float>::abs`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.abs)
- [`<float>::signum`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.signum)
- [`<float>::copysign`]
  (https://doc.rust-lang.org/stable/std/primitive.f32.html#method.copysign)
- [`MaybeUninit::write`]
  (https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.write)

Cargo
-----
- [Add future-incompatibility warning against keywords in cfgs and
  add raw-idents] (rust-lang/cargo#14671)
- [Stabilize higher precedence trailing flags]
  (rust-lang/cargo#14900)
- [Pass `CARGO_CFG_FEATURE` to build scripts]
  (rust-lang/cargo#14902)

Rustdoc
-----
- [Doc comment on impl blocks shows the first line, even when the
  impl block is collapsed] (rust-lang/rust#132155)

Compatibility Notes
-------------------
- [`rustc` no longer treats the `test` cfg as a well known
  check-cfg] (rust-lang/rust#131729),
  instead it is up to the build systems and users of
  `--check-cfg`[^check-cfg] to set it as a well known cfg using
  `--check-cfg=cfg(test)`.

  This is done to enable build systems like Cargo to set it
  conditionally, as not all source files are suitable for unit
  tests.

  [Cargo (for now) unconditionally sets the `test` cfg as a well known cfg]
  (rust-lang/cargo#14963).
  [^check-cfg]: https://doc.rust-lang.org/nightly/rustc/check-cfg.html

- [Disable potentially incorrect type inference if there are trivial
  and non-trivial where-clauses]
  (rust-lang/rust#132325)

- `std::env::home_dir()` has been deprecated for years, because it
  can give surprising results in some Windows configurations if the
  `HOME` environment variable is set (which is not the normal
  configuration on Windows). We had previously avoided changing its
  behavior, out of concern for compatibility with code depending on
  this non-standard configuration. Given how long this function has
  been deprecated, we're now fixing its behavior as a bugfix. A
  subsequent release will remove the deprecation for this function.

- [Make `core::ffi::c_char` signedness more closely match that of
  the platform-default `char`]
  (rust-lang/rust#132975)

  This changed `c_char` from an `i8` to `u8` or vice versa on many
  Tier 2 and 3 targets (mostly Arm and RISC-V embedded targets).
  The new definition may result in compilation failures but fixes
  compatibility issues with C.

  The `libc` crate matches this change as of its 0.2.169 release.

- [When compiling a nested `macro_rules` macro from an external
  crate, the content of the inner `macro_rules` is now built with
  the edition of the external crate, not the local crate.]
  (rust-lang/rust#133274)
- [Increase `sparcv9-sun-solaris` and `x86_64-pc-solaris` Solaris
  baseline to 11.4.]
  (rust-lang/rust#133293)
- [Show `abi_unsupported_vector_types` lint in future breakage reports]
  (rust-lang/rust#133374)
- [Error if multiple super-trait instantiations of `dyn Trait` need
  associated types to be specified but only one is provided]
  (rust-lang/rust#133392)
- [Change `powerpc64-ibm-aix` default `codemodel` to large]
  (rust-lang/rust#133811)

Internal Changes
----------------

These changes do not affect any public interfaces of Rust, but they
represent significant improvements to the performance or internals
of rustc and related tools.

- [Build `x86_64-unknown-linux-gnu` with LTO for C/C++ code (e.g., `jemalloc`)]
  (rust-lang/rust#134690)
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Feb 26, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [rust](https://github.com/rust-lang/rust) | minor | `1.84.1` -> `1.85.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.85.0`](https://github.com/rust-lang/rust/blob/HEAD/RELEASES.md#Version-1850-2025-02-20)

[Compare Source](rust-lang/rust@1.84.1...1.85.0)

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

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

## Language

-   [The 2024 Edition is now stable.](rust-lang/rust#133349)
    See [the edition guide](https://doc.rust-lang.org/nightly/edition-guide/rust-2024/index.html) for more details.
-   [Stabilize async closures](rust-lang/rust#132706)
    See [RFC 3668](https://rust-lang.github.io/rfcs/3668-async-closures.html) for more details.
-   [Stabilize `#[diagnostic::do_not_recommend]`](rust-lang/rust#132056)
-   [Add `unpredictable_function_pointer_comparisons` lint to warn against function pointer comparisons](rust-lang/rust#118833)
-   [Lint on combining `#[no_mangle]` and `#[export_name]` attributes.](rust-lang/rust#131558)

<a id="1.85.0-Compiler"></a>

## Compiler

-   [The unstable flag `-Zpolymorphize` has been removed](rust-lang/rust#133883), see rust-lang/compiler-team#810 for some background.

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

## Platform Support

-   [Promote `powerpc64le-unknown-linux-musl` to tier 2 with host tools](rust-lang/rust#133801)

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

<a id="1.85.0-Libraries"></a>

## Libraries

-   [Panics in the standard library now have a leading `library/` in their path](rust-lang/rust#132390)
-   [`std::env::home_dir()` on Windows now ignores the non-standard `$HOME` environment variable](rust-lang/rust#132515)

    It will be un-deprecated in a subsequent release.
-   [Add `AsyncFn*` to the prelude in all editions.](rust-lang/rust#132611)

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

## Stabilized APIs

-   [`BuildHasherDefault::new`](https://doc.rust-lang.org/stable/std/hash/struct.BuildHasherDefault.html#method.new)
-   [`ptr::fn_addr_eq`](https://doc.rust-lang.org/std/ptr/fn.fn_addr_eq.html)
-   [`io::ErrorKind::QuotaExceeded`](https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html#variant.QuotaExceeded)
-   [`io::ErrorKind::CrossesDevices`](https://doc.rust-lang.org/stable/std/io/enum.ErrorKind.html#variant.CrossesDevices)
-   [`{float}::midpoint`](https://doc.rust-lang.org/core/primitive.f32.html#method.midpoint)
-   [Unsigned `{integer}::midpoint`](https://doc.rust-lang.org/std/primitive.u64.html#method.midpoint)
-   [`NonZeroU*::midpoint`](https://doc.rust-lang.org/std/num/type.NonZeroU32.html#method.midpoint)
-   [impl `std::iter::Extend` for tuples with arity 1 through 12](https://doc.rust-lang.org/stable/std/iter/trait.Extend.html#impl-Extend%3C\(A,\)%3E-for-\(EA,\))
-   [`FromIterator<(A, ...)>` for tuples with arity 1 through 12](https://doc.rust-lang.org/stable/std/iter/trait.FromIterator.html#impl-FromIterator%3C\(EA,\)%3E-for-\(A,\))
-   [`std::task::Waker::noop`](https://doc.rust-lang.org/stable/std/task/struct.Waker.html#method.noop)

These APIs are now stable in const contexts:

-   [`mem::size_of_val`](https://doc.rust-lang.org/stable/std/mem/fn.size_of_val.html)
-   [`mem::align_of_val`](https://doc.rust-lang.org/stable/std/mem/fn.align_of_val.html)
-   [`Layout::for_value`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.for_value)
-   [`Layout::align_to`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.align_to)
-   [`Layout::pad_to_align`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.pad_to_align)
-   [`Layout::extend`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.extend)
-   [`Layout::array`](https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.array)
-   [`std::mem::swap`](https://doc.rust-lang.org/stable/std/mem/fn.swap.html)
-   [`std::ptr::swap`](https://doc.rust-lang.org/stable/std/ptr/fn.swap.html)
-   [`NonNull::new`](https://doc.rust-lang.org/stable/std/ptr/struct.NonNull.html#method.new)
-   [`HashMap::with_hasher`](https://doc.rust-lang.org/stable/std/collections/struct.HashMap.html#method.with_hasher)
-   [`HashSet::with_hasher`](https://doc.rust-lang.org/stable/std/collections/struct.HashSet.html#method.with_hasher)
-   [`BuildHasherDefault::new`](https://doc.rust-lang.org/stable/std/hash/struct.BuildHasherDefault.html#method.new)
-   [`<float>::recip`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.recip)
-   [`<float>::to_degrees`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.to_degrees)
-   [`<float>::to_radians`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.to_radians)
-   [`<float>::max`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.max)
-   [`<float>::min`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.min)
-   [`<float>::clamp`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.clamp)
-   [`<float>::abs`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.abs)
-   [`<float>::signum`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.signum)
-   [`<float>::copysign`](https://doc.rust-lang.org/stable/std/primitive.f32.html#method.copysign)
-   [`MaybeUninit::write`](https://doc.rust-lang.org/stable/std/mem/union.MaybeUninit.html#method.write)

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

## Cargo

-   [Add future-incompatibility warning against keywords in cfgs and add raw-idents](rust-lang/cargo#14671)
-   [Stabilize higher precedence trailing flags](rust-lang/cargo#14900)
-   [Pass `CARGO_CFG_FEATURE` to build scripts](rust-lang/cargo#14902)

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

## Rustdoc

-   [Doc comment on impl blocks shows the first line, even when the impl block is collapsed](rust-lang/rust#132155)

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

## Compatibility Notes

-   [`rustc` no longer treats the `test` cfg as a well known check-cfg](rust-lang/rust#131729), instead it is up to the build systems and users of `--check-cfg`\[^check-cfg] to set it as a well known cfg using `--check-cfg=cfg(test)`.

    This is done to enable build systems like Cargo to set it conditionally, as not all source files are suitable for unit tests.
    [Cargo (for now) unconditionally sets the `test` cfg as a well known cfg](rust-lang/cargo#14963).
    \[^check-cfg]: https://doc.rust-lang.org/nightly/rustc/check-cfg.html
-   [Disable potentially incorrect type inference if there are trivial and non-trivial where-clauses](rust-lang/rust#132325)
-   `std::env::home_dir()` has been deprecated for years, because it can give surprising results in some Windows configurations if the `HOME` environment variable is set (which is not the normal configuration on Windows). We had previously avoided changing its behavior, out of concern for compatibility with code depending on this non-standard configuration. Given how long this function has been deprecated, we're now fixing its behavior as a bugfix. A subsequent release will remove the deprecation for this function.
-   [Make `core::ffi::c_char` signedness more closely match that of the platform-default `char`](rust-lang/rust#132975)

    This changed `c_char` from an `i8` to `u8` or vice versa on many Tier 2 and 3
    targets (mostly Arm and RISC-V embedded targets). The new definition may
    result in compilation failures but fixes compatibility issues with C.

    The `libc` crate matches this change as of its 0.2.169 release.
-   [When compiling a nested `macro_rules` macro from an external crate, the content of the inner `macro_rules` is now built with the edition of the external crate, not the local crate.](rust-lang/rust#133274)
-   [Increase `sparcv9-sun-solaris` and `x86_64-pc-solaris` Solaris baseline to 11.4.](rust-lang/rust#133293)
-   [Show `abi_unsupported_vector_types` lint in future breakage reports](rust-lang/rust#133374)
-   [Error if multiple super-trait instantiations of `dyn Trait` need associated types to be specified but only one is provided](rust-lang/rust#133392)
-   [Change `powerpc64-ibm-aix` default `codemodel` to large](rust-lang/rust#133811)

<a id="1.85.0-Internal-Changes"></a>

## Internal Changes

These changes do not affect any public interfaces of Rust, but they represent
significant improvements to the performance or internals of rustc and related
tools.

-   [Build `x86_64-unknown-linux-gnu` with LTO for C/C++ code (e.g., `jemalloc`)](rust-lang/rust#134690)

</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 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 [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xODAuMyIsInVwZGF0ZWRJblZlciI6IjM5LjE4MC4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiXX0=-->
github-actions bot pushed a commit to thanhnguyen-aws/verify-rust-std that referenced this pull request Mar 3, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to carolynzech/rust that referenced this pull request Mar 4, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to carolynzech/rust that referenced this pull request Mar 4, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to thanhnguyen-aws/verify-rust-std that referenced this pull request Mar 4, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to tautschnig/verify-rust-std that referenced this pull request Mar 6, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
github-actions bot pushed a commit to thanhnguyen-aws/verify-rust-std that referenced this pull request Mar 6, 2025
As noted in rust-lang#132975 (comment),
the default for userland apps is to follow the architecture defaults, the
-funsigned-char flag only applies to kernel builds.
workingjubilee added a commit to workingjubilee/rustc that referenced this pull request Mar 7, 2025
…viper

Revert vita's c_char back to i8

# Description

Hi!

rust-lang#132975 changed the definition of `c_char` from i8 to u8 for most ARM targets. While that would usually be correct, [VITASDK uses signed chars by default](https://github.com/vitasdk/buildscripts/blob/master/patches/gcc/0001-gcc-10.patch#L33-L34). The Clang definitions are incorrect because Clang is not (yet?) supported by the vita commmunity / `VITADSK`, On the Rust side, the pre-compiled libraries the user can link to are all compiled using vita's `gcc` and [we set `TARGET_CC` and `TARGET_CXX`](https://github.com/vita-rust/cargo-vita/blob/d564a132cbd43947118c0d6d0ebfbea7d1dd7fa7/src/commands/build.rs#L230) in `cargo vita` for build scripts using `cc`.

I'm creating it as a draft PR so that we can discuss it and possibly get it approved here, but wait to merge the [libc side](rust-lang/libc#4258) and get a libc version first, as having the definitions out of sync breaks std. As a nightly-only target it can be confusing/frustrating for new users when the latest nightly, which is the default, is broken.
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request Mar 7, 2025
…viper

Revert vita's c_char back to i8

# Description

Hi!

rust-lang#132975 changed the definition of `c_char` from i8 to u8 for most ARM targets. While that would usually be correct, [VITASDK uses signed chars by default](https://github.com/vitasdk/buildscripts/blob/master/patches/gcc/0001-gcc-10.patch#L33-L34). The Clang definitions are incorrect because Clang is not (yet?) supported by the vita commmunity / `VITADSK`, On the Rust side, the pre-compiled libraries the user can link to are all compiled using vita's `gcc` and [we set `TARGET_CC` and `TARGET_CXX`](https://github.com/vita-rust/cargo-vita/blob/d564a132cbd43947118c0d6d0ebfbea7d1dd7fa7/src/commands/build.rs#L230) in `cargo vita` for build scripts using `cc`.

I'm creating it as a draft PR so that we can discuss it and possibly get it approved here, but wait to merge the [libc side](rust-lang/libc#4258) and get a libc version first, as having the definitions out of sync breaks std. As a nightly-only target it can be confusing/frustrating for new users when the latest nightly, which is the default, is broken.
jhpratt added a commit to jhpratt/rust that referenced this pull request Mar 7, 2025
…viper

Revert vita's c_char back to i8

# Description

Hi!

rust-lang#132975 changed the definition of `c_char` from i8 to u8 for most ARM targets. While that would usually be correct, [VITASDK uses signed chars by default](https://github.com/vitasdk/buildscripts/blob/master/patches/gcc/0001-gcc-10.patch#L33-L34). The Clang definitions are incorrect because Clang is not (yet?) supported by the vita commmunity / `VITADSK`, On the Rust side, the pre-compiled libraries the user can link to are all compiled using vita's `gcc` and [we set `TARGET_CC` and `TARGET_CXX`](https://github.com/vita-rust/cargo-vita/blob/d564a132cbd43947118c0d6d0ebfbea7d1dd7fa7/src/commands/build.rs#L230) in `cargo vita` for build scripts using `cc`.

I'm creating it as a draft PR so that we can discuss it and possibly get it approved here, but wait to merge the [libc side](rust-lang/libc#4258) and get a libc version first, as having the definitions out of sync breaks std. As a nightly-only target it can be confusing/frustrating for new users when the latest nightly, which is the default, is broken.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

relnotes Marks issues that should be documented in the release notes of the next release. S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-libs Relevant to the library team, which will review and decide on the PR/issue. T-libs-api Relevant to the library API team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

c_char signedness doesn't match with Clang's default on various no-std and tier 3 targets