From 6043a72774b1541aa165453fb2fdb96b58faaf86 Mon Sep 17 00:00:00 2001 From: Jed Davis Date: Sun, 30 Dec 2012 20:23:29 -0800 Subject: [PATCH] Make consts of degenerate nullary enums not ICE. This makes the const construction code match the logic in type_of. --- src/librustc/middle/trans/consts.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/librustc/middle/trans/consts.rs b/src/librustc/middle/trans/consts.rs index 94da557d39b..2d0ac47fd77 100644 --- a/src/librustc/middle/trans/consts.rs +++ b/src/librustc/middle/trans/consts.rs @@ -398,7 +398,6 @@ fn const_expr(cx: @crate_ctxt, e: @ast::expr) -> ValueRef { // forbids paths that don't map to C-like enum variants. let ety = ty::expr_ty(cx.tcx, e); let llty = type_of::type_of(cx, ety); - let llstructtys = lib::llvm::struct_element_types(llty); // Can't use `discrims` from the crate context here because // those discriminants have an extra level of indirection, @@ -422,8 +421,14 @@ fn const_expr(cx: @crate_ctxt, e: @ast::expr) -> ValueRef { lldiscrim = found_lldiscrim; } } + let fields = if ty::enum_is_univariant(cx.tcx, enum_did) { + ~[lldiscrim] + } else { + let llstructtys = lib::llvm::struct_element_types(llty); + ~[lldiscrim, C_null(llstructtys[1])] + }; - C_named_struct(llty, ~[ lldiscrim, C_null(llstructtys[1]) ]) + C_named_struct(llty, fields) } Some(ast::def_struct(_)) => { let ety = ty::expr_ty(cx.tcx, e);