rustc = { path = "../librustc" }
rustc_back = { path = "../librustc_back" }
rustc_const_eval = { path = "../librustc_const_eval" }
+rustc_const_math = { path = "../librustc_const_math" }
rustc_driver = { path = "../librustc_driver" }
rustc_errors = { path = "../librustc_errors" }
rustc_lint = { path = "../librustc_lint" }
BorrowedRef {lifetime: l.clean(cx), mutability: m.mutbl.clean(cx),
type_: box m.ty.clean(cx)},
TyVec(ref ty) => Vector(box ty.clean(cx)),
- TyFixedLengthVec(ref ty, ref e) =>
- FixedVector(box ty.clean(cx), pprust::expr_to_string(e)),
+ TyFixedLengthVec(ref ty, ref e) => {
+ let n = if let Some(tcx) = cx.tcx_opt() {
+ use rustc_const_math::{ConstInt, ConstUsize};
+ use rustc_const_eval::eval_const_expr;
+ use rustc::middle::const_val::ConstVal;
+ match eval_const_expr(tcx, e) {
+ ConstVal::Integral(ConstInt::Usize(u)) => match u {
+ ConstUsize::Us16(u) => u.to_string(),
+ ConstUsize::Us32(u) => u.to_string(),
+ ConstUsize::Us64(u) => u.to_string(),
+ },
+ // after type checking this can't fail
+ _ => unreachable!(),
+ }
+ } else {
+ pprust::expr_to_string(e)
+ };
+ FixedVector(box ty.clean(cx), n)
+ },
TyTup(ref tys) => Tuple(tys.clean(cx)),
TyPath(None, ref p) => {
resolve_type(cx, p.clean(cx), self.id)
extern crate libc;
extern crate rustc;
extern crate rustc_const_eval;
+extern crate rustc_const_math;
extern crate rustc_trans;
extern crate rustc_driver;
extern crate rustc_resolve;
}
// @has issue_33302/struct.S.html \
- // '//h3[@class="impl"]' 'impl T<[i32; 4 * 4]> for S'
- // @has - '//*[@id="associatedconstant.C"]' 'const C: [i32; 4 * 4] = [0; 4 * 4]'
+ // '//h3[@class="impl"]' 'impl T<[i32; 16]> for S'
+ // @has - '//*[@id="associatedconstant.C"]' 'const C: [i32; 16] = [0; 4 * 4]'
// @has - '//*[@id="associatedconstant.D"]' 'const D: i32 = 4 * 4'
impl T<[i32; ($n * $n)]> for S {
const C: [i32; ($n * $n)] = [0; ($n * $n)];