ref sty => bug!("unexpected sty: {:?}", sty)
},
Def::Const(def_id) |
- Def::AssociatedConst(def_id) => {
- let substs = Some(cx.tcx.node_id_item_substs(expr.id).substs);
- let tcx = cx.tcx.global_tcx();
- if let Some((e, _)) = const_eval::lookup_const_by_id(tcx, def_id, substs) {
- // FIXME ConstVal can't be yet used with adjustments, as they would be lost.
- if !cx.tcx.tables.borrow().adjustments.contains_key(&e.id) {
- if let Some(v) = cx.try_const_eval_literal(e) {
- return ExprKind::Literal { literal: v };
- }
- }
- }
- def_id
- }
+ Def::AssociatedConst(def_id) => def_id,
Def::Static(node_id, _) => return ExprKind::StaticRef {
id: node_id,
}
}
- pub fn try_const_eval_literal(&mut self, e: &hir::Expr) -> Option<Literal<'tcx>> {
- let hint = const_eval::EvalHint::ExprTypeChecked;
- let tcx = self.tcx.global_tcx();
- const_eval::eval_const_expr_partial(tcx, e, hint, None).ok().and_then(|v| {
- match v {
- // All of these contain local IDs, unsuitable for storing in MIR.
- ConstVal::Struct(_) | ConstVal::Tuple(_) |
- ConstVal::Array(..) | ConstVal::Repeat(..) |
- ConstVal::Function(_) => None,
-
- _ => Some(Literal::Value { value: v })
- }
- })
- }
-
pub fn trait_method(&mut self,
trait_def_id: DefId,
method_name: &str,