提交 42f95d05 编写于 作者: L Luqman Aden

Allow constant expressions in [Type * n].

上级 e78f2e2a
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
use core::prelude::*; use core::prelude::*;
use middle::const_eval;
use middle::ty::{arg, field, substs}; use middle::ty::{arg, field, substs};
use middle::ty::{ty_param_substs_and_ty}; use middle::ty::{ty_param_substs_and_ty};
use middle::ty; use middle::ty;
...@@ -412,9 +413,29 @@ fn check_path_args(tcx: ty::ctxt, ...@@ -412,9 +413,29 @@ fn check_path_args(tcx: ty::ctxt,
} }
} }
} }
ast::ty_fixed_length_vec(a_mt, u) => { ast::ty_fixed_length_vec(a_mt, e) => {
ty::mk_evec(tcx, ast_mt_to_mt(self, rscope, a_mt), match const_eval::eval_const_expr_partial(tcx, e) {
ty::vstore_fixed(u)) Ok(ref r) => {
match *r {
const_eval::const_int(i) =>
ty::mk_evec(tcx, ast_mt_to_mt(self, rscope, a_mt),
ty::vstore_fixed(i as uint)),
const_eval::const_uint(i) =>
ty::mk_evec(tcx, ast_mt_to_mt(self, rscope, a_mt),
ty::vstore_fixed(i as uint)),
_ => {
tcx.sess.span_fatal(
ast_ty.span, ~"expected constant expr for vector length");
}
}
}
Err(ref r) => {
tcx.sess.span_fatal(
ast_ty.span,
fmt!("expected constant expr for vector length: %s",
*r));
}
}
} }
ast::ty_infer => { ast::ty_infer => {
// ty_infer should only appear as the type of arguments or return // ty_infer should only appear as the type of arguments or return
......
...@@ -916,7 +916,7 @@ pub enum ty_ { ...@@ -916,7 +916,7 @@ pub enum ty_ {
ty_box(mt), ty_box(mt),
ty_uniq(mt), ty_uniq(mt),
ty_vec(mt), ty_vec(mt),
ty_fixed_length_vec(mt, uint), ty_fixed_length_vec(mt, @expr),
ty_ptr(mt), ty_ptr(mt),
ty_rptr(Option<@Lifetime>, mt), ty_rptr(Option<@Lifetime>, mt),
ty_closure(@TyClosure), ty_closure(@TyClosure),
......
...@@ -642,7 +642,8 @@ fn parse_ty(&self, colons_before_params: bool) -> @Ty { ...@@ -642,7 +642,8 @@ fn parse_ty(&self, colons_before_params: bool) -> @Ty {
self.obsolete(*self.last_span, ObsoleteMutVector); self.obsolete(*self.last_span, ObsoleteMutVector);
} }
// Parse the `* 3` in `[ int * 3 ]` // Parse the `* e` in `[ int * e ]`
// where `e` is a const expression
let t = match self.maybe_parse_fixed_vstore_with_star() { let t = match self.maybe_parse_fixed_vstore_with_star() {
None => ty_vec(mt), None => ty_vec(mt),
Some(suffix) => ty_fixed_length_vec(mt, suffix) Some(suffix) => ty_fixed_length_vec(mt, suffix)
...@@ -814,23 +815,9 @@ fn parse_fn_block_arg(&self) -> arg_or_capture_item { ...@@ -814,23 +815,9 @@ fn parse_fn_block_arg(&self) -> arg_or_capture_item {
}) })
} }
fn maybe_parse_fixed_vstore_with_star(&self) -> Option<uint> { fn maybe_parse_fixed_vstore_with_star(&self) -> Option<@ast::expr> {
if self.eat(&token::BINOP(token::STAR)) { if self.eat(&token::BINOP(token::STAR)) {
match *self.token { Some(self.parse_expr())
token::LIT_INT_UNSUFFIXED(i) if i >= 0i64 => {
self.bump();
Some(i as uint)
}
_ => {
self.fatal(
fmt!(
"expected integral vector length \
but found `%s`",
token_to_str(self.reader, &copy *self.token)
)
);
}
}
} else { } else {
None None
} }
......
...@@ -425,7 +425,7 @@ pub fn print_type_ex(s: @ps, &&ty: @ast::Ty, print_colons: bool) { ...@@ -425,7 +425,7 @@ pub fn print_type_ex(s: @ps, &&ty: @ast::Ty, print_colons: bool) {
} }
print_type(s, mt.ty); print_type(s, mt.ty);
word(s.s, ~" * "); word(s.s, ~" * ");
word(s.s, fmt!("%u", v)); word(s.s, fmt!("%?", v));
word(s.s, ~"]"); word(s.s, ~"]");
} }
ast::ty_mac(_) => { ast::ty_mac(_) => {
...@@ -1015,7 +1015,7 @@ pub fn print_mac(s: @ps, m: ast::mac) { ...@@ -1015,7 +1015,7 @@ pub fn print_mac(s: @ps, m: ast::mac) {
pub fn print_vstore(s: @ps, t: ast::vstore) { pub fn print_vstore(s: @ps, t: ast::vstore) {
match t { match t {
ast::vstore_fixed(Some(i)) => word(s.s, fmt!("%u", i)), ast::vstore_fixed(Some(i)) => word(s.s, fmt!("%?", i)),
ast::vstore_fixed(None) => word(s.s, ~"_"), ast::vstore_fixed(None) => word(s.s, ~"_"),
ast::vstore_uniq => word(s.s, ~"~"), ast::vstore_uniq => word(s.s, ~"~"),
ast::vstore_box => word(s.s, ~"@"), ast::vstore_box => word(s.s, ~"@"),
...@@ -1028,7 +1028,7 @@ pub fn print_vstore(s: @ps, t: ast::vstore) { ...@@ -1028,7 +1028,7 @@ pub fn print_vstore(s: @ps, t: ast::vstore) {
pub fn print_expr_vstore(s: @ps, t: ast::expr_vstore) { pub fn print_expr_vstore(s: @ps, t: ast::expr_vstore) {
match t { match t {
ast::expr_vstore_fixed(Some(i)) => word(s.s, fmt!("%u", i)), ast::expr_vstore_fixed(Some(i)) => word(s.s, fmt!("%?", i)),
ast::expr_vstore_fixed(None) => word(s.s, ~"_"), ast::expr_vstore_fixed(None) => word(s.s, ~"_"),
ast::expr_vstore_uniq => word(s.s, ~"~"), ast::expr_vstore_uniq => word(s.s, ~"~"),
ast::expr_vstore_box => word(s.s, ~"@"), ast::expr_vstore_box => word(s.s, ~"@"),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册