rust/compiler
Jacob Pratt 8951c74e2a
Rollup merge of #138285 - beetrees:repr128-stable, r=traviscross,bjorn3
Stabilize `repr128`

## Stabilisation report

The `repr128` feature ([tracking issue](https://github.com/rust-lang/rust/issues/56071)) allows the use of `#[repr(u128)]` and `#[repr(i128)]` on enums in the same way that other primitive representations such as `#[repr(u64)]` can be used. For example:

```rust
#[repr(u128)]
enum Foo {
    One = 1,
    Two,
    Big = u128::MAX,
}

#[repr(i128)]
enum Bar {
    HasThing(u16) = 42,
    HasSomethingElse(i64) = u64::MAX as i128 + 1,
    HasNothing,
}
```

This is the final part of adding 128-bit integers to Rust ([RFC 1504](https://rust-lang.github.io/rfcs/1504-int128.html)); all other parts of 128-bit integer support were stabilised in #49101 back in 2018.

From a design perspective, `#[repr(u128)]`/`#[repr(i128)]` function like `#[repr(u64)]`/`#[repr(i64)]` but for 128-bit integers instead of 64-bit integers. The only differences are:

- FFI safety: as `u128`/`i128` are not currently considered FFI safe, neither are `#[repr(u128)]`/`#[repr(i128)]` enums (I discovered this wasn't the case while drafting this stabilisation report, so I have submitted #138282 to fix this).
- Debug info: while none of the major debuggers currently support 128-bit integers, as of LLVM 20 `rustc` will emit valid debuginfo for both DWARF and PDB (PDB makes use of the same natvis that is also used for all enums with fields, whereas DWARF has native support).

Tests for `#[repr(u128)]`/`#[repr(i128)]` enums include:
- [ui/enum-discriminant/repr128.rs](385970f0c1/tests/ui/enum-discriminant/repr128.rs): checks that 128-bit enum discriminants have the correct values.
- [debuginfo/msvc-pretty-enums.rs](385970f0c1/tests/debuginfo/msvc-pretty-enums.rs): checks the PDB debuginfo is correct.
- [run-make/repr128-dwarf](385970f0c1/tests/run-make/repr128-dwarf/rmake.rs): checks the DWARF debuginfo is correct.

Stabilising this feature does not require any changes to the Rust Reference as [the documentation on primitive representations](https://doc.rust-lang.org/nightly/reference/type-layout.html#r-layout.repr.primitive.intro) already includes `u128` and `i128`.

Closes #56071
Closes https://github.com/rust-lang/reference/issues/1368

r? lang

```@rustbot``` label +I-lang-nominated +T-lang
2025-05-29 04:50:46 +02:00
..
rustc Revert "Use workspace lints for crates in compiler/ #138084" 2025-03-10 18:12:47 +08:00
rustc_abi Initial UnsafePinned/UnsafeUnpin impl [Part 1: Libs] 2025-04-13 01:11:04 -04:00
rustc_arena Introduce Arena::try_alloc_from_iter. 2025-04-19 01:13:18 +00:00
rustc_ast Rollup merge of #141632 - fee1-dead-contrib:push-txmttkxvwqxl, r=oli-obk 2025-05-27 20:57:55 +02:00
rustc_ast_ir Use -Wunused_crate_dependencies for compiler crates. 2025-03-20 08:59:43 +11:00
rustc_ast_lowering Rename kw::Empty as sym::empty. 2025-05-22 11:55:22 +10:00
rustc_ast_passes update cfg(bootstrap) 2025-05-12 15:33:37 +02:00
rustc_ast_pretty Initial support for dynamically linked crates 2025-05-04 22:03:15 +03:00
rustc_attr_data_structures Make #[cfg(version)] respect RUSTC_OVERRIDE_VERSION_STRING 2025-05-24 23:54:17 +02:00
rustc_attr_parsing Add custom trait for emitting lint within cfg_matches 2025-05-26 21:51:09 +02:00
rustc_baked_icu_data Add unreachable_pub to RUSTC_LINT_FLAGS for compiler/ crates. 2025-03-11 13:14:21 +11:00
rustc_borrowck Fix some var names 2025-05-27 11:14:47 +00:00
rustc_builtin_macros Rollup merge of #140697 - Sa4dUs:split-autodiff, r=ZuseZ4 2025-05-28 10:28:08 -04:00
rustc_codegen_cranelift Merge commit '979dcf8e2f' into sync_cg_clif-2025-05-25 2025-05-25 18:51:16 +00:00
rustc_codegen_gcc Remove usage of FnAbi in codegen_intrinsic_call 2025-05-26 10:13:03 +00:00
rustc_codegen_llvm Rollup merge of #141404 - bjorn3:refactor_cg_ssa_call_codegen, r=davidtwco 2025-05-28 10:28:09 -04:00
rustc_codegen_ssa Rollup merge of #141404 - bjorn3:refactor_cg_ssa_call_codegen, r=davidtwco 2025-05-28 10:28:09 -04:00
rustc_const_eval Rollup merge of #141495 - compiler-errors:rename-unpack, r=fmease 2025-05-27 20:57:54 +02:00
rustc_data_structures Rollup merge of #139668 - matthewjasper:upper-bound-fix, r=compiler-errors 2025-05-22 16:02:26 +02:00
rustc_driver Remove recursion_limit increases. 2025-04-02 16:25:27 +11:00
rustc_driver_impl compiler & tools: bump windows crate to dedupe versions 2025-05-17 15:26:38 +03:00
rustc_error_codes Stabilise repr128 2025-05-28 15:14:34 +01:00
rustc_error_messages bump fluent-* crates 2025-05-27 14:11:14 +03:00
rustc_errors Remove an unnecessary use of Box::into_inner. 2025-05-27 02:06:40 +10:00
rustc_expand Rollup merge of #141548 - bvanjoi:issue-141256, r=petrochenkov 2025-05-28 10:28:10 -04:00
rustc_feature Stabilise repr128 2025-05-28 15:14:34 +01:00
rustc_fluent_macro bump fluent-* crates 2025-05-27 14:11:14 +03:00
rustc_fs_util Retry if creating temp fails with access denied 2025-04-25 11:28:36 +00:00
rustc_graphviz Remove #![warn(unreachable_pub)] from all compiler/ crates. 2025-03-11 13:14:21 +11:00
rustc_hashes Revert "Use workspace lints for crates in compiler/ #138084" 2025-03-10 18:12:47 +08:00
rustc_hir Rename kw::Empty as sym::empty. 2025-05-22 11:55:22 +10:00
rustc_hir_analysis Stabilise repr128 2025-05-28 15:14:34 +01:00
rustc_hir_pretty update cfg(bootstrap) 2025-05-12 15:33:37 +02:00
rustc_hir_typeck Rollup merge of #141495 - compiler-errors:rename-unpack, r=fmease 2025-05-27 20:57:54 +02:00
rustc_incremental Auto merge of #139758 - Zoxc:thread-local-graph, r=oli-obk 2025-05-07 12:39:54 +00:00
rustc_index Add copy_within to IndexSlice 2025-04-15 10:44:28 -04:00
rustc_index_macros In rustc_mir_tranform, iterate over index newtypes instead of ints 2025-04-12 11:53:07 +00:00
rustc_infer Fix some var names 2025-05-27 11:14:47 +00:00
rustc_interface coverage: Revert "unused local file IDs" due to empty function names 2025-05-27 23:33:29 +10:00
rustc_lexer Implement RFC 3503: frontmatters 2025-05-05 23:10:08 +08:00
rustc_lint Rollup merge of #141551 - compiler-errors:hir-lints, r=BoxyUwU 2025-05-27 20:28:32 -04:00
rustc_lint_defs Make UNNECESSARY_TRANSMUTES into a HIR lint 2025-05-25 15:57:48 +00:00
rustc_llvm Experimental cygwin support in rustc 2025-05-15 23:34:11 +08:00
rustc_log Allow linking rustc and rustdoc against the same single tracing crate 2025-05-03 10:18:50 -07:00
rustc_macros Allow trailing comma after argument in query definition 2025-05-20 10:22:08 +00:00
rustc_metadata Introduce tcx.anon_const_kind query 2025-05-21 20:20:19 +01:00
rustc_middle Rollup merge of #141551 - compiler-errors:hir-lints, r=BoxyUwU 2025-05-27 20:28:32 -04:00
rustc_mir_build Rollup merge of #141627 - nnethercote:drop-cleanups, r=matthewjasper 2025-05-28 10:28:11 -04:00
rustc_mir_dataflow update cfg(bootstrap) 2025-05-12 15:33:37 +02:00
rustc_mir_transform Rollup merge of #141551 - compiler-errors:hir-lints, r=BoxyUwU 2025-05-27 20:28:32 -04:00
rustc_monomorphize Rollup merge of #140874 - mejrs:rads, r=WaffleLapkin 2025-05-19 13:24:54 +10:00
rustc_next_trait_solver Fix some var names 2025-05-27 11:14:47 +00:00
rustc_parse Rollup merge of #141670 - chenyukang:yukang-fix-ice-from-contracts, r=nnethercote 2025-05-28 10:28:11 -04:00
rustc_parse_format Remove duplicate impl of string unescape 2025-05-06 10:00:22 +00:00
rustc_passes Rollup merge of #140697 - Sa4dUs:split-autodiff, r=ZuseZ4 2025-05-28 10:28:08 -04:00
rustc_pattern_analysis Revert "Fix stack overflow in exhaustiveness due to recursive HIR opaque type values" 2025-05-20 10:09:01 +00:00
rustc_privacy Rollup merge of #140874 - mejrs:rads, r=WaffleLapkin 2025-05-19 13:24:54 +10:00
rustc_query_impl Auto merge of #140145 - Zoxc:job-server-proxy, r=SparrowLii 2025-05-01 04:11:52 +00:00
rustc_query_system Handle rustc_query_system cases of rustc::potential_query_instability lint 2025-05-14 08:59:55 +03:00
rustc_resolve consider glob imports in cfg suggestion 2025-05-28 00:59:47 +08:00
rustc_sanitizers Rename unpack to kind 2025-05-27 11:14:45 +00:00
rustc_serialize Zero the buffer passed from write_with 2025-04-25 07:14:27 +02:00
rustc_session coverage: Revert "unused local file IDs" due to empty function names 2025-05-27 23:33:29 +10:00
rustc_smir Rename unpack to kind 2025-05-27 11:14:45 +00:00
rustc_span Rollup merge of #140697 - Sa4dUs:split-autodiff, r=ZuseZ4 2025-05-28 10:28:08 -04:00
rustc_symbol_mangling Rename unpack to kind 2025-05-27 11:14:45 +00:00
rustc_target Enable xray support for Mac 2025-05-24 15:06:53 +08:00
rustc_trait_selection Rename unpack to kind 2025-05-27 11:14:45 +00:00
rustc_traits Querify coroutine_hidden_types 2025-05-20 11:50:25 +00:00
rustc_transmute Rollup merge of #140509 - tmiasko:merge-contiguous-ranges, r=jswrenn 2025-05-02 19:37:56 +02:00
rustc_ty_utils Rollup merge of #141495 - compiler-errors:rename-unpack, r=fmease 2025-05-27 20:57:54 +02:00
rustc_type_ir Fix some var names 2025-05-27 11:14:47 +00:00
rustc_type_ir_macros Split TypeFolder and FallibleTypeFolder 2025-04-15 18:30:35 +00:00
stable_mir Change rustc_driver dependency on stable_mir crate 2025-04-30 15:39:52 -07:00