auto merge of #16934 : nick29581/rust/dst-bug-6, r=pcwalton

Closes #16911 

r?
This commit is contained in:
bors 2014-09-03 06:26:02 +00:00
commit b7d456dfea
2 changed files with 19 additions and 5 deletions

View File

@ -170,7 +170,7 @@ fn const_deref(cx: &CrateContext, v: ValueRef, t: ty::t, explicit: bool)
} }
} }
None => { None => {
cx.sess().bug(format!("can't dereference const of type {}", cx.sess().bug(format!("cannot dereference const of type {}",
ty_to_string(cx.tcx(), t)).as_slice()) ty_to_string(cx.tcx(), t)).as_slice())
} }
} }
@ -225,10 +225,12 @@ pub fn const_expr(cx: &CrateContext, e: &ast::Expr, is_local: bool) -> (ValueRef
ty::AutoDerefRef(ref adj) => { ty::AutoDerefRef(ref adj) => {
let mut ty = ety; let mut ty = ety;
// Save the last autoderef in case we can avoid it. // Save the last autoderef in case we can avoid it.
for _ in range(0, adj.autoderefs-1) { if adj.autoderefs > 0 {
let (dv, dt) = const_deref(cx, llconst, ty, false); for _ in range(0, adj.autoderefs-1) {
llconst = dv; let (dv, dt) = const_deref(cx, llconst, ty, false);
ty = dt; llconst = dv;
ty = dt;
}
} }
match adj.autoref { match adj.autoref {
@ -263,6 +265,8 @@ pub fn const_expr(cx: &CrateContext, e: &ast::Expr, is_local: bool) -> (ValueRef
// work properly. // work properly.
let (_, dt) = const_deref(cx, llconst, ty, false); let (_, dt) = const_deref(cx, llconst, ty, false);
ty = dt; ty = dt;
} else {
llconst = const_addr_of(cx, llconst, ast::MutImmutable)
} }
match ty::get(ty).sty { match ty::get(ty).sty {

View File

@ -12,11 +12,21 @@
static x : [int, ..4] = [1,2,3,4]; static x : [int, ..4] = [1,2,3,4];
static y : &'static [int] = &[1,2,3,4]; static y : &'static [int] = &[1,2,3,4];
static z : &'static [int, ..4] = &[1,2,3,4];
static zz : &'static [int] = [1,2,3,4];
pub fn main() { pub fn main() {
println!("{:?}", x[1]); println!("{:?}", x[1]);
println!("{:?}", y[1]); println!("{:?}", y[1]);
println!("{:?}", z[1]);
println!("{:?}", zz[1]);
assert_eq!(x[1], 2); assert_eq!(x[1], 2);
assert_eq!(x[3], 4); assert_eq!(x[3], 4);
assert_eq!(x[3], y[3]); assert_eq!(x[3], y[3]);
assert_eq!(z[1], 2);
assert_eq!(z[3], 4);
assert_eq!(z[3], y[3]);
assert_eq!(zz[1], 2);
assert_eq!(zz[3], 4);
assert_eq!(zz[3], y[3]);
} }