impl<'tcx> Const<'tcx> {
/// Literals and const generic parameters are eagerly converted to a constant, everything else
/// becomes `Unevaluated`.
- pub fn from_hir_anon_const(
- tcx: TyCtxt<'tcx>,
- ast_const: &hir::AnonConst,
- ty: Ty<'tcx>,
- ) -> &'tcx Self {
- debug!("Const::from_hir_anon_const(id={:?}, ast_const={:?})", ast_const.hir_id, ast_const);
+ pub fn from_hir_anon_const(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Ty<'tcx>) -> &'tcx Self {
+ debug!("Const::from_hir_anon_const(id={:?})", def_id);
+
+ let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap();
- let def_id = tcx.hir().local_def_id(ast_const.hir_id);
+ let body_id = tcx.hir().body_owned_by(hir_id);
- let expr = &tcx.hir().body(ast_const.body).value;
+ let expr = &tcx.hir().body(body_id).value;
let lit_input = match expr.kind {
hir::ExprKind::Lit(ref lit) => Some(LitToConstInput { lit: &lit.node, ty, neg: false }),
// Now comes the rote stuff:
hir::ExprKind::Repeat(ref v, ref count) => {
+ let count = cx.tcx.hir().local_def_id(count.hir_id);
let count = ty::Const::from_hir_anon_const(cx.tcx, count, cx.tcx.types.usize);
ExprKind::Repeat { value: v.to_ref(), count }
}
}
(GenericParamDefKind::Const, GenericArg::Const(ct)) => {
- ty::Const::from_hir_anon_const(tcx, &ct.value, tcx.type_of(param.def_id)).into()
+ let ct = tcx.hir().local_def_id(ct.value.hir_id);
+ ty::Const::from_hir_anon_const(tcx, ct, tcx.type_of(param.def_id)).into()
}
_ => unreachable!(),
},
.unwrap_or(tcx.types.err)
}
hir::TyKind::Array(ref ty, ref length) => {
+ let length = tcx.hir().local_def_id(length.hir_id);
let length = ty::Const::from_hir_anon_const(tcx, length, tcx.types.usize);
let array_ty = tcx.mk_ty(ty::Array(self.ast_ty_to_ty(&ty), length));
self.normalize_ty(ast_ty.span, array_ty)
}
pub fn to_const(&self, ast_c: &hir::AnonConst, ty: Ty<'tcx>) -> &'tcx ty::Const<'tcx> {
- ty::Const::from_hir_anon_const(self.tcx, ast_c, ty)
+ let c = self.tcx.hir().local_def_id(ast_c.hir_id);
+ ty::Const::from_hir_anon_const(self.tcx, c, ty)
}
// If the type given by the user has free regions, save it for later, since