about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2020-09-01 09:49:40 -0400
committerMark Rousskov <mark.simulacrum@gmail.com>2020-09-01 10:01:28 -0400
commite023158145ece18176a2e93420600ccda0d0bc58 (patch)
tree11d7120ccb511602dd0377a317fa827c763ff598
parente88e908e66cd1e6e30d789b37bcd774951d01856 (diff)
downloadrust-e023158145ece18176a2e93420600ccda0d0bc58.tar.gz
rust-e023158145ece18176a2e93420600ccda0d0bc58.zip
Permit uninhabited enums to cast into ints
This essentially reverts part of #6204.
-rw-r--r--compiler/rustc_middle/src/ty/mod.rs4
-rw-r--r--src/test/ui/uninhabited/uninhabited-enum-cast.rs4
-rw-r--r--src/test/ui/uninhabited/uninhabited-enum-cast.stderr9
3 files changed, 6 insertions, 11 deletions
diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs
index b6300a40b0d..3e7d370c0af 100644
--- a/compiler/rustc_middle/src/ty/mod.rs
+++ b/compiler/rustc_middle/src/ty/mod.rs
@@ -2481,8 +2481,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.
diff --git a/src/test/ui/uninhabited/uninhabited-enum-cast.rs b/src/test/ui/uninhabited/uninhabited-enum-cast.rs
index 7e178e054cc..5a75c94c42f 100644
--- a/src/test/ui/uninhabited/uninhabited-enum-cast.rs
+++ b/src/test/ui/uninhabited/uninhabited-enum-cast.rs
@@ -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() {}
diff --git a/src/test/ui/uninhabited/uninhabited-enum-cast.stderr b/src/test/ui/uninhabited/uninhabited-enum-cast.stderr
deleted file mode 100644
index a9f10dfec99..00000000000
--- a/src/test/ui/uninhabited/uninhabited-enum-cast.stderr
+++ /dev/null
@@ -1,9 +0,0 @@
-error[E0605]: non-primitive cast: `E` as `isize`
-  --> $DIR/uninhabited-enum-cast.rs:4:20
-   |
-LL |     println!("{}", (e as isize).to_string());
-   |                    ^^^^^^^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0605`.