about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorSimonas Kazlauskas <git@kazlauskas.me>2015-11-11 17:58:41 +0200
committerSimonas Kazlauskas <git@kazlauskas.me>2015-11-12 01:30:17 +0200
commite4e880df37d5daff3dec8adf1629df45fd8a6132 (patch)
treed3658d1bbea35e246b96cf73a099064857006634 /src
parentdb89a75a801622db9673f4175f645330b29509c4 (diff)
downloadrust-e4e880df37d5daff3dec8adf1629df45fd8a6132.tar.gz
rust-e4e880df37d5daff3dec8adf1629df45fd8a6132.zip
Const-eval array element repetition count
Diffstat (limited to 'src')
-rw-r--r--src/librustc_mir/hair/cx/expr.rs21
-rw-r--r--src/librustc_mir/hair/cx/mod.rs7
-rw-r--r--src/librustc_mir/hair/mod.rs3
3 files changed, 23 insertions, 8 deletions
diff --git a/src/librustc_mir/hair/cx/expr.rs b/src/librustc_mir/hair/cx/expr.rs
index 847d76f7d17..ed9d7560a4b 100644
--- a/src/librustc_mir/hair/cx/expr.rs
+++ b/src/librustc_mir/hair/cx/expr.rs
@@ -17,7 +17,6 @@ use hair::cx::block;
 use hair::cx::pattern::PatNode;
 use hair::cx::to_ref::ToRef;
 use rustc::front::map;
-use rustc::middle::const_eval;
 use rustc::middle::def;
 use rustc::middle::region::CodeExtent;
 use rustc::middle::pat_util;
@@ -81,10 +80,9 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
                 }
             }
 
-            hir::ExprLit(..) => {
-                let value = const_eval::eval_const_expr(cx.tcx, self);
-                ExprKind::Literal { literal: Literal::Value { value: value } }
-            }
+            hir::ExprLit(..) => ExprKind::Literal {
+                literal: cx.const_eval_literal(self)
+            },
 
             hir::ExprBinary(op, ref lhs, ref rhs) => {
                 if cx.tcx.is_method_call(self.id) {
@@ -273,8 +271,17 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr {
 
             // Now comes the rote stuff:
 
-            hir::ExprRepeat(ref v, ref c) =>
-                ExprKind::Repeat { value: v.to_ref(), count: c.to_ref() },
+            hir::ExprRepeat(ref v, ref c) => ExprKind::Repeat {
+                value: v.to_ref(),
+                count: Expr {
+                    ty: cx.tcx.expr_ty(c),
+                    temp_lifetime: None,
+                    span: c.span,
+                    kind: ExprKind::Literal {
+                        literal: cx.const_eval_literal(c)
+                    }
+                }.to_ref()
+            },
             hir::ExprRet(ref v) =>
                 ExprKind::Return { value: v.to_ref() },
             hir::ExprBreak(label) =>
diff --git a/src/librustc_mir/hair/cx/mod.rs b/src/librustc_mir/hair/cx/mod.rs
index 8d4b05afcb6..0373dab150e 100644
--- a/src/librustc_mir/hair/cx/mod.rs
+++ b/src/librustc_mir/hair/cx/mod.rs
@@ -18,13 +18,14 @@
 use hair::*;
 use repr::*;
 
-use rustc::middle::const_eval::ConstVal;
+use rustc::middle::const_eval::{self, ConstVal};
 use rustc::middle::def_id::DefId;
 use rustc::middle::infer::InferCtxt;
 use rustc::middle::subst::{Subst, Substs};
 use rustc::middle::ty::{self, Ty};
 use syntax::codemap::Span;
 use syntax::parse::token;
+use rustc_front::hir;
 
 #[derive(Copy, Clone)]
 pub struct Cx<'a, 'tcx: 'a> {
@@ -73,6 +74,10 @@ impl<'a,'tcx:'a> Cx<'a, 'tcx> {
         Literal::Value { value: ConstVal::Bool(false) }
     }
 
+    pub fn const_eval_literal(&mut self, e: &hir::Expr) -> Literal<'tcx> {
+        Literal::Value { value: const_eval::eval_const_expr(self.tcx, e) }
+    }
+
     pub fn partial_eq(&mut self, ty: Ty<'tcx>) -> ItemRef<'tcx> {
         let eq_def_id = self.tcx.lang_items.eq_trait().unwrap();
         self.cmp_method_ref(eq_def_id, "eq", ty)
diff --git a/src/librustc_mir/hair/mod.rs b/src/librustc_mir/hair/mod.rs
index becaa19974d..af3a20245de 100644
--- a/src/librustc_mir/hair/mod.rs
+++ b/src/librustc_mir/hair/mod.rs
@@ -210,6 +210,9 @@ pub enum ExprKind<'tcx> {
     },
     Repeat {
         value: ExprRef<'tcx>,
+        // FIXME(#29789): Add a separate hair::Constant<'tcx> so this could be more explicit about
+        // its contained data. Currently this should only contain expression of ExprKind::Literal
+        // kind.
         count: ExprRef<'tcx>,
     },
     Vec {