Skip to content

Commit 9ad616a

Browse files
committed
Make vectors of enums work as constants
1 parent 6cdc283 commit 9ad616a

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/librustc/middle/trans/consts.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,15 @@ pub fn const_vec(cx: @crate_ctxt, e: @ast::expr, es: &[@ast::expr])
7373
let vec_ty = ty::expr_ty(cx.tcx, e);
7474
let unit_ty = ty::sequence_element_type(cx.tcx, vec_ty);
7575
let llunitty = type_of::type_of(cx, unit_ty);
76-
let v = C_array(llunitty, es.map(|e| const_expr(cx, *e)));
7776
let unit_sz = machine::llsize_of(cx, llunitty);
7877
let sz = llvm::LLVMConstMul(C_uint(cx, es.len()), unit_sz);
78+
let vs = es.map(|e| const_expr(cx, *e));
79+
// If the vector contains enums, an LLVM array won't work.
80+
let v = if vs.any(|vi| val_ty(*vi) != llunitty) {
81+
C_struct(vs)
82+
} else {
83+
C_array(llunitty, vs)
84+
};
7985
return (v, sz, llunitty);
8086
}
8187
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
enum E { V1(int), V0 }
12+
const C: [E * 3] = [V0, V1(0xDEADBEE), V0];
13+
14+
fn main() {
15+
match C[1] {
16+
V1(n) => assert(n == 0xDEADBEE),
17+
_ => die!()
18+
}
19+
match C[2] {
20+
V0 => (),
21+
_ => die!()
22+
}
23+
}

0 commit comments

Comments
 (0)