about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-07-27 13:01:32 -0700
committerbors <bors@rust-lang.org>2013-07-27 13:01:32 -0700
commit32622cef992fea2ba23bafe39ed08730a2b78fb4 (patch)
tree28ad7f63a69683cb2e056c3cf1c55cba16e2eb21
parent5157e05049d76f1206c9f879961194d4ac26ce58 (diff)
parent68b61e8cc905eee36c69a74689119893df3cc872 (diff)
downloadrust-32622cef992fea2ba23bafe39ed08730a2b78fb4.tar.gz
rust-32622cef992fea2ba23bafe39ed08730a2b78fb4.zip
auto merge of #8078 : luqmana/rust/gst, r=Aatch
Fixes #5917 by not trying to treat `&[T]` as a slice since it already is one.
-rw-r--r--src/librustc/middle/trans/consts.rs11
-rw-r--r--src/test/run-pass/static-vec-autoref.rs21
2 files changed, 29 insertions, 3 deletions
diff --git a/src/librustc/middle/trans/consts.rs b/src/librustc/middle/trans/consts.rs
index db9e3db2c0f..853b3a3c28f 100644
--- a/src/librustc/middle/trans/consts.rs
+++ b/src/librustc/middle/trans/consts.rs
@@ -211,11 +211,16 @@ pub fn const_expr(cx: @mut CrateContext, e: @ast::expr) -> ValueRef {
                         }
                         ty::AutoBorrowVec(ty::re_static, m) => {
                             assert!(m != ast::m_mutbl);
-                            let size = machine::llsize_of(cx,
-                                                          val_ty(llconst));
                             assert_eq!(abi::slice_elt_base, 0);
                             assert_eq!(abi::slice_elt_len, 1);
-                            llconst = C_struct([llptr, size]);
+
+                            match ty::get(ty).sty {
+                                ty::ty_evec(_, ty::vstore_fixed(*)) => {
+                                    let size = machine::llsize_of(cx, val_ty(llconst));
+                                    llconst = C_struct([llptr, size]);
+                                }
+                                _ => {}
+                            }
                         }
                         _ => {
                             cx.sess.span_bug(e.span,
diff --git a/src/test/run-pass/static-vec-autoref.rs b/src/test/run-pass/static-vec-autoref.rs
new file mode 100644
index 00000000000..8d6f08583db
--- /dev/null
+++ b/src/test/run-pass/static-vec-autoref.rs
@@ -0,0 +1,21 @@
+// 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 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+struct T(&'static [int]);
+
+static A: T = T(&'static [5, 4, 3]);
+static B: T = T(&[5, 4, 3]);
+static C: T = T([5, 4, 3]);
+
+pub fn main() {
+    assert_eq!(A[0], 5);
+    assert_eq!(B[1], 4);
+    assert_eq!(C[2], 3);
+}