From c0f587de34f30b060df8a88c4068740e587b9340 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Thu, 2 May 2013 18:41:57 -0700 Subject: [PATCH] librustc: Make uninhabited enums not castable to int --- src/librustc/middle/ty.rs | 15 +++++++++------ src/test/compile-fail/uninhabited-enum-cast.rs | 7 +++++++ 2 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 src/test/compile-fail/uninhabited-enum-cast.rs diff --git a/src/librustc/middle/ty.rs b/src/librustc/middle/ty.rs index c42c4c3cf07..d28efcd55b0 100644 --- a/src/librustc/middle/ty.rs +++ b/src/librustc/middle/ty.rs @@ -2509,12 +2509,15 @@ pub fn type_is_enum(ty: t) -> bool { // constructors pub fn type_is_c_like_enum(cx: ctxt, ty: t) -> bool { match get(ty).sty { - ty_enum(did, _) => { - let variants = enum_variants(cx, did); - let some_n_ary = vec::any(*variants, |v| vec::len(v.args) > 0u); - return !some_n_ary; - } - _ => return false + ty_enum(did, _) => { + let variants = enum_variants(cx, did); + if variants.len() == 0 { + false + } else { + variants.all(|v| v.args.len() == 0) + } + } + _ => false } } diff --git a/src/test/compile-fail/uninhabited-enum-cast.rs b/src/test/compile-fail/uninhabited-enum-cast.rs new file mode 100644 index 00000000000..c4a5dc4710c --- /dev/null +++ b/src/test/compile-fail/uninhabited-enum-cast.rs @@ -0,0 +1,7 @@ +enum E {} + +fn f(e: E) { + println((e as int).to_str()); //~ ERROR non-scalar cast +} + +fn main() {} -- 2.44.0