diff --git a/src/librustc/middle/trans/consts.rs b/src/librustc/middle/trans/consts.rs index a9dea596f7d..841ffa231d1 100644 --- a/src/librustc/middle/trans/consts.rs +++ b/src/librustc/middle/trans/consts.rs @@ -434,7 +434,13 @@ pub fn const_expr(cx: @crate_ctxt, e: @ast::expr) -> ValueRef { let lldiscrim = base::get_discrim_val(cx, e.span, enum_did, variant_did); - C_struct(~[lldiscrim]) + // However, we still have to pad it out to the + // size of the full enum; see the expr_call case, + // below. + let ety = ty::expr_ty(cx.tcx, e); + let size = machine::static_size_of_enum(cx, ety); + let padding = C_null(T_array(T_i8(), size)); + C_struct(~[lldiscrim, padding]) } Some(ast::def_struct(_)) => { let ety = ty::expr_ty(cx.tcx, e); diff --git a/src/test/run-pass/const-enum-tuple2.rs b/src/test/run-pass/const-enum-tuple2.rs new file mode 100644 index 00000000000..c02bdc74cfe --- /dev/null +++ b/src/test/run-pass/const-enum-tuple2.rs @@ -0,0 +1,18 @@ +// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +enum E { V0, V16(u16) } +const C: (E, u16, u16) = (V0, 0x600D, 0xBAD); + +fn main() { + let (_, n, _) = C; + assert n != 0xBAD; + assert n == 0x600D; +}