1
Fork 0
rust/compiler
Jack Wrenn df1d6168f4 safe transmute: support non-ZST, variantful, uninhabited enums
Previously, `Tree::from_enum`'s implementation branched into three disjoint
cases:

 1. enums that uninhabited
 2. enums for which all but one variant is uninhabited
 3. enums with multiple inhabited variants

This branching (incorrectly) did not differentiate between variantful and
variantless uninhabited enums. In both cases, we assumed (and asserted) that
uninhabited enums are zero-sized types. This assumption is false for enums like:

    enum Uninhabited { A(!, u128) }

...which, currently, has the same size as `u128`. This faulty assumption
manifested as the ICE reported in #126460.

In this PR, we revise the first case of `Tree::from_enum` to consider only the
narrow category of "enums that are uninhabited ZSTs". These enums, whose layouts
are described with `Variants::Single { index }`, are special in their layouts
otherwise resemble the `!` type and cannot be descended into like typical enums.
This first case captures uninhabited enums like:

    enum Uninhabited { A(!, !), B(!) }

The second case is revised to consider the broader category of "enums that defer
their layout to one of their variants"; i.e., enums whose layouts are described
with `Variants::Single { index }` and that do have a variant at `index`. This
second case captures uninhabited enums that are not ZSTs, like:

    enum Uninhabited { A(!, u128) }

...which represent their variants with `Variants::Single`.

Finally, the third case is revised to cover the broader category of "enums with
multiple variants", which captures uninhabited, non-ZST enums like:

    enum Uninhabited { A(u8, !), B(!, u32) }

...which represent their variants with `Variants::Multiple`.

This PR also adds a comment requested by RalfJung in his review of #126358 to
`compiler/rustc_const_eval/src/interpret/discriminant.rs`.

Fixes #126460
2024-06-14 21:11:08 +00:00
..
rustc Change SIGPIPE ui from #[unix_sigpipe = "..."] to -Zon-broken-pipe=... 2024-05-02 19:48:29 +02:00
rustc_abi Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_arena Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_ast Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_ast_ir Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_ast_lowering Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_ast_passes Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_ast_pretty Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_attr Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_baked_icu_data Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_borrowck Rollup merge of #126320 - oli-obk:pat_ice, r=lcnr 2024-06-14 08:35:48 +02:00
rustc_builtin_macros Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_codegen_cranelift Auto merge of #126319 - workingjubilee:rollup-lendnud, r=workingjubilee 2024-06-12 11:10:50 +00:00
rustc_codegen_gcc ScalarInt: size mismatches are a bug, do not delay the panic 2024-06-10 13:43:16 +02:00
rustc_codegen_llvm Rollup merge of #126324 - zmodem:loongarch, r=nikic 2024-06-12 14:26:28 -04:00
rustc_codegen_ssa Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_const_eval safe transmute: support non-ZST, variantful, uninhabited enums 2024-06-14 21:11:08 +00:00
rustc_data_structures Rollup merge of #126368 - nnethercote:rm-more-unused-crate-deps, r=jackh726 2024-06-14 08:35:50 +02:00
rustc_driver Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_driver_impl Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_error_codes Auto merge of #126319 - workingjubilee:rollup-lendnud, r=workingjubilee 2024-06-12 11:10:50 +00:00
rustc_error_messages Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_errors Auto merge of #125410 - fmease:adj-lint-diag-api, r=nnethercote 2024-05-27 08:44:12 +00:00
rustc_expand Rollup merge of #125913 - fmease:early-lints-spruce-up-some-diags, r=Nadrieril 2024-06-11 09:14:34 +01:00
rustc_feature Auto merge of #126273 - pietroalbini:pa-bootstrap-update, r=Mark-Simulacrum 2024-06-12 18:15:32 +00:00
rustc_fluent_macro Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_fs_util Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_graphviz Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_hir Rollup merge of #126054 - veera-sivarajan:bugfix-113073-bound-on-generics-2, r=fee1-dead 2024-06-14 12:23:36 +02:00
rustc_hir_analysis Rollup merge of #126054 - veera-sivarajan:bugfix-113073-bound-on-generics-2, r=fee1-dead 2024-06-14 12:23:36 +02:00
rustc_hir_pretty Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_hir_typeck Rollup merge of #126320 - oli-obk:pat_ice, r=lcnr 2024-06-14 08:35:48 +02:00
rustc_incremental Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_index Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_index_macros Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_infer Rollup merge of #126368 - nnethercote:rm-more-unused-crate-deps, r=jackh726 2024-06-14 08:35:50 +02:00
rustc_interface Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_lexer Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_lint Auto merge of #126273 - pietroalbini:pa-bootstrap-update, r=Mark-Simulacrum 2024-06-12 18:15:32 +00:00
rustc_lint_defs Fixup links in lint docs 2024-06-13 12:24:31 +02:00
rustc_llvm Auto merge of #125141 - SergioGasquez:feat/no_std-xtensa, r=davidtwco 2024-06-12 13:43:31 +00:00
rustc_log Bump tracing-tree and allow rendering lines again 2024-06-12 10:11:41 +00:00
rustc_macros Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_metadata Only compute specializes query if specialization is enabled in the crate of the specialized impl 2024-06-07 15:58:50 -04:00
rustc_middle Rollup merge of #123962 - oli-obk:define_opaque_types5, r=lcnr 2024-06-14 08:35:46 +02:00
rustc_mir_build Add TODO comment to unsafe env modification 2024-06-12 17:51:18 +02:00
rustc_mir_dataflow Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_mir_transform Rollup merge of #126392 - WaffleLapkin:gvn-style-ish-changes, r=scottmcm 2024-06-13 22:55:48 +02:00
rustc_monomorphize Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_next_trait_solver Remove some unused crate dependencies. 2024-06-10 19:55:49 +10:00
rustc_parse Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_parse_format Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_passes Rollup merge of #126315 - mu001999-contrib:fix/126289, r=petrochenkov 2024-06-13 22:55:45 +02:00
rustc_pattern_analysis Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_privacy Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_query_impl Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_query_system Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_resolve Tweak output of import suggestions 2024-06-13 20:22:21 +00:00
rustc_sanitizers Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_serialize Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_session Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_smir Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_span LangItem-ify Coroutine trait in solvers 2024-06-13 09:34:28 -04:00
rustc_symbol_mangling Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_target Rollup merge of #126324 - zmodem:loongarch, r=nikic 2024-06-12 14:26:28 -04:00
rustc_trait_selection Address nits 2024-06-13 09:47:45 -04:00
rustc_traits Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_transmute safe transmute: support non-ZST, variantful, uninhabited enums 2024-06-14 21:11:08 +00:00
rustc_ty_utils Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_type_ir Address nits 2024-06-13 09:47:45 -04:00
rustc_type_ir_macros Uplift TraitPredicate 2024-05-11 18:20:00 -04:00
stable_mir Rollup merge of #126366 - celinval:issue-0080-def-ty, r=oli-obk 2024-06-13 13:05:25 +02:00