Make consts of degenerate nullary enums not ICE.

This makes the const construction code match the logic in type_of.
This commit is contained in:
Jed Davis 2012-12-30 20:23:29 -08:00
parent 7b245d46ed
commit 6043a72774

View File

@ -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. // forbids paths that don't map to C-like enum variants.
let ety = ty::expr_ty(cx.tcx, e); let ety = ty::expr_ty(cx.tcx, e);
let llty = type_of::type_of(cx, ety); 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 // Can't use `discrims` from the crate context here because
// those discriminants have an extra level of indirection, // 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; 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(_)) => { Some(ast::def_struct(_)) => {
let ety = ty::expr_ty(cx.tcx, e); let ety = ty::expr_ty(cx.tcx, e);