Description
Hi there!
I'm trying to track down an issue we're having with nightly
and cbindgen
in https://github.com/rustls/rustls-ffi. In particular, we rely on cbindgen
's functionality to map Cargo feature flags to C #define
's and #if defined(xxx)
guards. Since our codebase uses some macros, we also rely on cbindgen
's parse.expand
functionality, which in turn requires using nightly
.
Sometime recently with a nightly update we observed the generated .h
produced by cbindgen
was no longer producing the required #if defined(XXX)
guards.
I believe I've traced this down to something changing in the nightly
toolchain such that -Zunpretty=expanded
with --features
enabled no longer produces expanded code decorated with the #[cfg(feature = "xxx")]
annotations. I think this in turn means cbindgen
doesn't associate the function with required features.
The reproduction I offer below doesn't use cbindgen
at all, and so is hopefully easier to reason about.
Code
I tried cargo rustc --features=turbo-mode -- -Zunpretty=expanded
with the following code using nightly:
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
#[cfg(feature = "turbo-mode")]
pub fn turbo_add(left: u64, right: u64) -> u64 {
left + right
}
I expected to see this happen: I expected the produced output to show the turbo_add
code annotated with the expected #[cfg(feature = "turbo-mode")]
annotation:
#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2024::*;
#[macro_use]
extern crate std;
pub fn add(left: u64, right: u64) -> u64 { left + right }
#[cfg(feature = "turbo-mode")]
pub fn turbo_add(left: u64, right: u64) -> u64 { left + right }
Instead, this happened: the output with the most recent nightly instead drops the annotation, producing:
#![feature(prelude_import)]
#[prelude_import]
use std::prelude::rust_2024::*;
#[macro_use]
extern crate std;
pub fn add(left: u64, right: u64) -> u64 { left + right }
pub fn turbo_add(left: u64, right: u64) -> u64 { left + right }
I pushed a simple reproduction repo here: https://github.com/cpu/expand-test
Version it worked on
It most recently worked on: nightly-2025-03-25
Version with regression
The first failure I saw from this was on nightly-x86_64-unknown-linux-gnu - rustc 1.88.0-nightly (1799887 2025-03-29)
Backtrace
N/A
Activity
Urgau commentedon Apr 12, 2025
I suspect this might be #138844 (cc @petrochenkov).
However I don't think we have any stability guarantee about the nightly only
-Zunpretty=expanded
flag.cpu commentedon Apr 12, 2025
Sorry, I totally forgot
cargo expand
isn't first-party 😅The same issue demonstrates with
cargo rustc --features=turbo-mode -- -Zunpretty=expanded
. I should have phrased my report without thecargo expand
bits.Edit: updated to remove the
cargo expand
bits.[-]cargo expand no longer emitting `#[cfg(feature = xxx)]` guards?[/-][+]`-Zunpretty=expanded` no longer emitting `#[cfg(feature = xxx)]` guards?[/+]cpu commentedon Apr 12, 2025
From my perspective this feels less like a stability concern and more like an accuracy concern. IMO the expanded code seems to misrepresent the original source.