Uh oh!
There was an error while loading. Please reload this page.
Guarantee size and alignment of more integer primitives - #2205
Conversation
Thanks. I pushed a clarification and separated out the rules. Clearly we want to guarantee this for fixed-width integers of the same size. @rfcbot fcp merge lang |
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. |
Uh oh!
There was an error while loading. Please reload this page.
scottmcm
commented
Mar 18, 2026
Good to see this being specifically about for the stated @rfcbot reviewed |
rust-rfcbot
commented
Mar 18, 2026
🔔 This is now entering its final comment period, as per the review above. 🔔 |
This comment has been minimized.
This comment has been minimized.
rustbot
commented
Mar 24, 2026
This PR was rebased onto a different master commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
joshlf
commented
Mar 24, 2026
Now that the |
programmerjake
commented
Mar 27, 2026
I created a minimal Source code#![feature(intrinsics)]#![feature(rustc_attrs)]#![allow(internal_features)]#![feature(lang_items)]#![feature(no_core)]#![no_core]#[lang = "pointee_sized"]pubtraitPointeeSized{}#[lang = "meta_sized"]pubtraitMetaSized:PointeeSized{}#[lang = "sized"]pubtraitSized{}#[lang = "clone"]pubtraitClone:Sized{fnclone(&self) -> Self;}#[lang = "copy"]pubtraitCopy:Clone{}#[lang = "legacy_receiver"]pubtraitLegacyReceiver{}impl<T: ?Sized>LegacyReceiverfor&'_T{}#[rustc_nounwind]#[rustc_intrinsic]pubconstfnalign_of<T>() -> usize;const _:[();align_of::<u32>()] = [();align_of::<char>()];const _:[();align_of::<u32>()] = [();align_of::<f32>()];const _:[();align_of::<u64>()] = [();align_of::<f64>()];I checked with rustc 1.94.0 with: fortargetin`rustc --print=target-list`;do RUSTC_BOOTSTRAP=1 cargo check --target="$target"||echo"failed on $target";donethat gives failures on Compiler errors |
programmerjake
commented
Mar 27, 2026
so, I think we can guarantee that |
RalfJung
commented
Mar 27, 2026
FWIW we also guarantee that usize is ABI-compatible with the equal-sized unsigned int, and similar for isize (and we test for that). So unless we want to take that back, the ship has sailed for targets where that wouldn't be true. |
Okay, updated to guarantee size/alignment equality for:
|
rust-rfcbot
commented
Mar 28, 2026
The final comment period, with a disposition to merge, as per the review above, is now complete. As the automated representative of the governance process, I would like to thank the author for their work and everyone else who contributed. |
The purpose of the existing `layout.primitive.align` rule is to state that the alignment of primitives is platform-specific. Adding a separate alignment guarantee for integers overloads this a bit. Let's instead separate out the rules; we'll rename the existing rule since there are now two rules speaking to alignment.
Let's make this wording a bit more clear, and let's fix the em dash to use `---` since that's what our renderer expects.
traviscross
commented
Mar 31, 2026
We're talking about this one on the lang-docs call. @joshlf, you had added some commits expanding the guarantee based on feedback after the lang team had reviewed and approved this. If you don't mind, let's handle those in a separate PR so that we can cleanly ensure lang-team signoff. I've rolled this back to the commit the lang team reviewed and rebased (and backed up your other work; let me know if you need that). Given the completed FCP, let's merge that. |
Uh oh!
There was an error while loading. Please reload this page.
Update books ## rust-lang/reference 6 commits in 7446bf9697c95d155eef33c6a9d91fbd29a5e359..d2715c07e9dd9839c0c7675ecfa18bec539a6ee9 2026-03-31 18:18:16 UTC to 2026-03-23 21:49:16 UTC - Guarantee size and alignment of more integer primitives (rust-lang/reference#2205) - [type layout] usize and isize have the same size and alignment (rust-lang/reference#2200) - Update reference for attribute order changes (rust-lang/reference#2213) - Fix note for non_exhaustive enum read (rust-lang/reference#2211) - Update link_name duplicates note (rust-lang/reference#2216) - Note scoping differences between `*x` and `*x.deref()` , and `a[b]` and `*a.index(b)` (rust-lang/reference#2073) ## rust-lang/rust-by-example 8 commits in 5383db524711c0c9c43c3ca9e5e706089672ed6a..b31e3b8da01eeba0460f86a52a55af82709fadf5 2026-04-01 11:59:18 UTC to 2026-03-30 12:17:12 UTC - fix: correct into_iter() example to compile properly (rust-lang/rust-by-example#2001) - fix: correct destruction order comments in Drop TempFile example (rust-lang/rust-by-example#2002) - fix: replace confusing 'module' with 'item' in formatted print docs (rust-lang/rust-by-example#2003) - fix: clarify misleading 'Error' comment in print_display example (rust-lang/rust-by-example#2004) - fix: clarify comment about tuple struct field access in testcase_list (rust-lang/rust-by-example#2005) - fix: correct iter/into_iter type comments in iter_find example (rust-lang/rust-by-example#2006) - fix: replace year-to-days conversion with miles-to-km in newtype example (rust-lang/rust-by-example#2007) - Add a pub use example (rust-lang/rust-by-example#2000)
Update books ## rust-lang/reference 6 commits in 7446bf9697c95d155eef33c6a9d91fbd29a5e359..d2715c07e9dd9839c0c7675ecfa18bec539a6ee9 2026-03-31 18:18:16 UTC to 2026-03-23 21:49:16 UTC - Guarantee size and alignment of more integer primitives (rust-lang/reference#2205) - [type layout] usize and isize have the same size and alignment (rust-lang/reference#2200) - Update reference for attribute order changes (rust-lang/reference#2213) - Fix note for non_exhaustive enum read (rust-lang/reference#2211) - Update link_name duplicates note (rust-lang/reference#2216) - Note scoping differences between `*x` and `*x.deref()` , and `a[b]` and `*a.index(b)` (rust-lang/reference#2073) ## rust-lang/rust-by-example 8 commits in 5383db524711c0c9c43c3ca9e5e706089672ed6a..b31e3b8da01eeba0460f86a52a55af82709fadf5 2026-04-01 11:59:18 UTC to 2026-03-30 12:17:12 UTC - fix: correct into_iter() example to compile properly (rust-lang/rust-by-example#2001) - fix: correct destruction order comments in Drop TempFile example (rust-lang/rust-by-example#2002) - fix: replace confusing 'module' with 'item' in formatted print docs (rust-lang/rust-by-example#2003) - fix: clarify misleading 'Error' comment in print_display example (rust-lang/rust-by-example#2004) - fix: clarify comment about tuple struct field access in testcase_list (rust-lang/rust-by-example#2005) - fix: correct iter/into_iter type comments in iter_find example (rust-lang/rust-by-example#2006) - fix: replace year-to-days conversion with miles-to-km in newtype example (rust-lang/rust-by-example#2007) - Add a pub use example (rust-lang/rust-by-example#2000)
Rollup merge of #154901 - rustbot:docs-update, r=ehuss Update books ## rust-lang/reference 6 commits in 7446bf9697c95d155eef33c6a9d91fbd29a5e359..d2715c07e9dd9839c0c7675ecfa18bec539a6ee9 2026-03-31 18:18:16 UTC to 2026-03-23 21:49:16 UTC - Guarantee size and alignment of more integer primitives (rust-lang/reference#2205) - [type layout] usize and isize have the same size and alignment (rust-lang/reference#2200) - Update reference for attribute order changes (rust-lang/reference#2213) - Fix note for non_exhaustive enum read (rust-lang/reference#2211) - Update link_name duplicates note (rust-lang/reference#2216) - Note scoping differences between `*x` and `*x.deref()` , and `a[b]` and `*a.index(b)` (rust-lang/reference#2073) ## rust-lang/rust-by-example 8 commits in 5383db524711c0c9c43c3ca9e5e706089672ed6a..b31e3b8da01eeba0460f86a52a55af82709fadf5 2026-04-01 11:59:18 UTC to 2026-03-30 12:17:12 UTC - fix: correct into_iter() example to compile properly (rust-lang/rust-by-example#2001) - fix: correct destruction order comments in Drop TempFile example (rust-lang/rust-by-example#2002) - fix: replace confusing 'module' with 'item' in formatted print docs (rust-lang/rust-by-example#2003) - fix: clarify misleading 'Error' comment in print_display example (rust-lang/rust-by-example#2004) - fix: clarify comment about tuple struct field access in testcase_list (rust-lang/rust-by-example#2005) - fix: correct iter/into_iter type comments in iter_find example (rust-lang/rust-by-example#2006) - fix: replace year-to-days conversion with miles-to-km in newtype example (rust-lang/rust-by-example#2007) - Add a pub use example (rust-lang/rust-by-example#2000)
Update books ## rust-lang/reference 6 commits in 7446bf9697c95d155eef33c6a9d91fbd29a5e359..d2715c07e9dd9839c0c7675ecfa18bec539a6ee9 2026-03-31 18:18:16 UTC to 2026-03-23 21:49:16 UTC - Guarantee size and alignment of more integer primitives (rust-lang/reference#2205) - [type layout] usize and isize have the same size and alignment (rust-lang/reference#2200) - Update reference for attribute order changes (rust-lang/reference#2213) - Fix note for non_exhaustive enum read (rust-lang/reference#2211) - Update link_name duplicates note (rust-lang/reference#2216) - Note scoping differences between `*x` and `*x.deref()` , and `a[b]` and `*a.index(b)` (rust-lang/reference#2073) ## rust-lang/rust-by-example 8 commits in 5383db524711c0c9c43c3ca9e5e706089672ed6a..b31e3b8da01eeba0460f86a52a55af82709fadf5 2026-04-01 11:59:18 UTC to 2026-03-30 12:17:12 UTC - fix: correct into_iter() example to compile properly (rust-lang/rust-by-example#2001) - fix: correct destruction order comments in Drop TempFile example (rust-lang/rust-by-example#2002) - fix: replace confusing 'module' with 'item' in formatted print docs (rust-lang/rust-by-example#2003) - fix: clarify misleading 'Error' comment in print_display example (rust-lang/rust-by-example#2004) - fix: clarify comment about tuple struct field access in testcase_list (rust-lang/rust-by-example#2005) - fix: correct iter/into_iter type comments in iter_find example (rust-lang/rust-by-example#2006) - fix: replace year-to-days conversion with miles-to-km in newtype example (rust-lang/rust-by-example#2007) - Add a pub use example (rust-lang/rust-by-example#2000)
Update books ## rust-lang/reference 6 commits in 7446bf9697c95d155eef33c6a9d91fbd29a5e359..d2715c07e9dd9839c0c7675ecfa18bec539a6ee9 2026-03-31 18:18:16 UTC to 2026-03-23 21:49:16 UTC - Guarantee size and alignment of more integer primitives (rust-lang/reference#2205) - [type layout] usize and isize have the same size and alignment (rust-lang/reference#2200) - Update reference for attribute order changes (rust-lang/reference#2213) - Fix note for non_exhaustive enum read (rust-lang/reference#2211) - Update link_name duplicates note (rust-lang/reference#2216) - Note scoping differences between `*x` and `*x.deref()` , and `a[b]` and `*a.index(b)` (rust-lang/reference#2073) ## rust-lang/rust-by-example 8 commits in 5383db524711c0c9c43c3ca9e5e706089672ed6a..b31e3b8da01eeba0460f86a52a55af82709fadf5 2026-04-01 11:59:18 UTC to 2026-03-30 12:17:12 UTC - fix: correct into_iter() example to compile properly (rust-lang/rust-by-example#2001) - fix: correct destruction order comments in Drop TempFile example (rust-lang/rust-by-example#2002) - fix: replace confusing 'module' with 'item' in formatted print docs (rust-lang/rust-by-example#2003) - fix: clarify misleading 'Error' comment in print_display example (rust-lang/rust-by-example#2004) - fix: clarify comment about tuple struct field access in testcase_list (rust-lang/rust-by-example#2005) - fix: correct iter/into_iter type comments in iter_find example (rust-lang/rust-by-example#2006) - fix: replace year-to-days conversion with miles-to-km in newtype example (rust-lang/rust-by-example#2007) - Add a pub use example (rust-lang/rust-by-example#2000)
Follows up on #2200 (comment)
As an optional extension, we could consider guaranteeing equality between the alignments of:
u32andcharu32andf32u64andf64Those equalities strike me as less important, and I'm not sure if they're even valid (ie, whether they hold on all platforms).