Auto merge of #34684 - oli-obk:eval_rustdoc_array_len, r=alexcrichton
evaluate the array length of fixed size array types in rustdoc mitgates #34579 to fix it we'd need an expression simplifier. r? @steveklabnik cc @Osspial
This commit is contained in:
commit
3dbbe2f716
5 changed files with 24 additions and 4 deletions
|
@ -14,6 +14,7 @@ arena = { path = "../libarena" }
|
||||||
rustc = { path = "../librustc" }
|
rustc = { path = "../librustc" }
|
||||||
rustc_back = { path = "../librustc_back" }
|
rustc_back = { path = "../librustc_back" }
|
||||||
rustc_const_eval = { path = "../librustc_const_eval" }
|
rustc_const_eval = { path = "../librustc_const_eval" }
|
||||||
|
rustc_const_math = { path = "../librustc_const_math" }
|
||||||
rustc_driver = { path = "../librustc_driver" }
|
rustc_driver = { path = "../librustc_driver" }
|
||||||
rustc_errors = { path = "../librustc_errors" }
|
rustc_errors = { path = "../librustc_errors" }
|
||||||
rustc_lint = { path = "../librustc_lint" }
|
rustc_lint = { path = "../librustc_lint" }
|
||||||
|
|
|
@ -1624,8 +1624,25 @@ impl Clean<Type> for hir::Ty {
|
||||||
BorrowedRef {lifetime: l.clean(cx), mutability: m.mutbl.clean(cx),
|
BorrowedRef {lifetime: l.clean(cx), mutability: m.mutbl.clean(cx),
|
||||||
type_: box m.ty.clean(cx)},
|
type_: box m.ty.clean(cx)},
|
||||||
TyVec(ref ty) => Vector(box ty.clean(cx)),
|
TyVec(ref ty) => Vector(box ty.clean(cx)),
|
||||||
TyFixedLengthVec(ref ty, ref e) =>
|
TyFixedLengthVec(ref ty, ref e) => {
|
||||||
FixedVector(box ty.clean(cx), pprust::expr_to_string(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)),
|
TyTup(ref tys) => Tuple(tys.clean(cx)),
|
||||||
TyPath(None, ref p) => {
|
TyPath(None, ref p) => {
|
||||||
resolve_type(cx, p.clean(cx), self.id)
|
resolve_type(cx, p.clean(cx), self.id)
|
||||||
|
|
|
@ -34,6 +34,7 @@ extern crate getopts;
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
extern crate rustc;
|
extern crate rustc;
|
||||||
extern crate rustc_const_eval;
|
extern crate rustc_const_eval;
|
||||||
|
extern crate rustc_const_math;
|
||||||
extern crate rustc_trans;
|
extern crate rustc_trans;
|
||||||
extern crate rustc_driver;
|
extern crate rustc_driver;
|
||||||
extern crate rustc_resolve;
|
extern crate rustc_resolve;
|
||||||
|
|
1
src/rustc/Cargo.lock
generated
1
src/rustc/Cargo.lock
generated
|
@ -350,6 +350,7 @@ dependencies = [
|
||||||
"rustc 0.0.0",
|
"rustc 0.0.0",
|
||||||
"rustc_back 0.0.0",
|
"rustc_back 0.0.0",
|
||||||
"rustc_const_eval 0.0.0",
|
"rustc_const_eval 0.0.0",
|
||||||
|
"rustc_const_math 0.0.0",
|
||||||
"rustc_driver 0.0.0",
|
"rustc_driver 0.0.0",
|
||||||
"rustc_errors 0.0.0",
|
"rustc_errors 0.0.0",
|
||||||
"rustc_lint 0.0.0",
|
"rustc_lint 0.0.0",
|
||||||
|
|
|
@ -34,8 +34,8 @@ macro_rules! make {
|
||||||
}
|
}
|
||||||
|
|
||||||
// @has issue_33302/struct.S.html \
|
// @has issue_33302/struct.S.html \
|
||||||
// '//h3[@class="impl"]' 'impl T<[i32; 4 * 4]> for S'
|
// '//h3[@class="impl"]' 'impl T<[i32; 16]> for S'
|
||||||
// @has - '//*[@id="associatedconstant.C"]' 'const C: [i32; 4 * 4] = [0; 4 * 4]'
|
// @has - '//*[@id="associatedconstant.C"]' 'const C: [i32; 16] = [0; 4 * 4]'
|
||||||
// @has - '//*[@id="associatedconstant.D"]' 'const D: i32 = 4 * 4'
|
// @has - '//*[@id="associatedconstant.D"]' 'const D: i32 = 4 * 4'
|
||||||
impl T<[i32; ($n * $n)]> for S {
|
impl T<[i32; ($n * $n)]> for S {
|
||||||
const C: [i32; ($n * $n)] = [0; ($n * $n)];
|
const C: [i32; ($n * $n)] = [0; ($n * $n)];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue