Skip to content

Commit

Permalink
Rollup merge of rust-lang#76199 - Mark-Simulacrum:void-zero, r=nikoma…
Browse files Browse the repository at this point in the history
…tsakis

Permit uninhabited enums to cast into ints

This essentially reverts part of rust-lang#6204; it is unclear why that [commit](rust-lang@c0f587d) was introduced, and I suspect no one remembers.

The changed code was only called from casting checks and appears to not affect any callers of that code (other than permitting this one case).

Fixes rust-lang#75647.
  • Loading branch information
Dylan-DPC authored Oct 17, 2020
2 parents e3051d8 + 990a395 commit 6b1083c
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 12 deletions.
4 changes: 3 additions & 1 deletion compiler/rustc_middle/src/ty/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2436,8 +2436,10 @@ impl<'tcx> AdtDef {
self.variants.iter().flat_map(|v| v.fields.iter())
}

/// Whether the ADT lacks fields. Note that this includes uninhabited enums,
/// e.g., `enum Void {}` is considered payload free as well.
pub fn is_payloadfree(&self) -> bool {
!self.variants.is_empty() && self.variants.iter().all(|v| v.fields.is_empty())
self.variants.iter().all(|v| v.fields.is_empty())
}

/// Return a `VariantDef` given a variant id.
Expand Down
7 changes: 6 additions & 1 deletion compiler/rustc_mir/src/interpret/cast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,14 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {

// # First handle non-scalar source values.

// Handle cast from a univariant (ZST) enum.
// Handle cast from a ZST enum (0 or 1 variants).
match src.layout.variants {
Variants::Single { index } => {
if src.layout.abi.is_uninhabited() {
// This is dead code, because an uninhabited enum is UB to
// instantiate.
throw_ub!(Unreachable);
}
if let Some(discr) = src.layout.ty.discriminant_for_variant(*self.tcx, index) {
assert!(src.layout.is_zst());
let discr_layout = self.layout_of(discr.ty)?;
Expand Down
4 changes: 3 additions & 1 deletion src/test/ui/uninhabited/uninhabited-enum-cast.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
// check-pass

enum E {}

fn f(e: E) {
println!("{}", (e as isize).to_string()); //~ ERROR non-primitive cast
println!("{}", (e as isize).to_string());
}

fn main() {}
9 changes: 0 additions & 9 deletions src/test/ui/uninhabited/uninhabited-enum-cast.stderr

This file was deleted.

0 comments on commit 6b1083c

Please sign in to comment.