about summary refs log tree commit diff
path: root/src/librustc_codegen_ssa
diff options
context:
space:
mode:
authorBastian Kauschke <bastian_kauschke@hotmail.de>2020-03-22 11:34:42 +0100
committerBastian Kauschke <bastian_kauschke@hotmail.de>2020-03-22 11:34:42 +0100
commit0c5c3bbdabc60bd7dd7491dfcf6befb8202d7521 (patch)
tree4f0c332f5c6b9d9668d791d6f129636c8c59e77f /src/librustc_codegen_ssa
parent98803c182b2ba6ef5dccb6bf501958249295eac0 (diff)
downloadrust-0c5c3bbdabc60bd7dd7491dfcf6befb8202d7521.tar.gz
rust-0c5c3bbdabc60bd7dd7491dfcf6befb8202d7521.zip
handle unevaluated consts after monomophize
Diffstat (limited to 'src/librustc_codegen_ssa')
-rw-r--r--src/librustc_codegen_ssa/mir/constant.rs47
1 files changed, 26 insertions, 21 deletions
diff --git a/src/librustc_codegen_ssa/mir/constant.rs b/src/librustc_codegen_ssa/mir/constant.rs
index 4248627dcca..0fcd11d8100 100644
--- a/src/librustc_codegen_ssa/mir/constant.rs
+++ b/src/librustc_codegen_ssa/mir/constant.rs
@@ -40,31 +40,36 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
         &mut self,
         constant: &mir::Constant<'tcx>,
     ) -> Result<ConstValue<'tcx>, ErrorHandled> {
-        match constant.literal.val {
+        let const_ = match constant.literal.val {
             ty::ConstKind::Unevaluated(def_id, substs, promoted) => {
                 let substs = self.monomorphize(&substs);
-                self.cx
-                    .tcx()
-                    .const_eval_resolve(ty::ParamEnv::reveal_all(), def_id, substs, promoted, None)
-                    .map_err(|err| {
-                        if promoted.is_none() {
-                            self.cx
-                                .tcx()
-                                .sess
-                                .span_err(constant.span, "erroneous constant encountered");
-                        }
-                        err
-                    })
+                ty::ConstKind::Unevaluated(def_id, substs, promoted)
             }
+            ty::ConstKind::Value(value) => ty::ConstKind::Value(value),
+            ty::ConstKind::Param(_) => self.monomorphize(&constant.literal).val,
+            _ => span_bug!(constant.span, "encountered bad Const in codegen: {:?}", constant),
+        };
+
+        match const_ {
+            ty::ConstKind::Unevaluated(def_id, substs, promoted) => self
+                .cx
+                .tcx()
+                .const_eval_resolve(ty::ParamEnv::reveal_all(), def_id, substs, promoted, None)
+                .map_err(|err| {
+                    if promoted.is_none() {
+                        self.cx
+                            .tcx()
+                            .sess
+                            .span_err(constant.span, "erroneous constant encountered");
+                    }
+                    err
+                }),
             ty::ConstKind::Value(value) => Ok(value),
-            _ => {
-                let const_ = self.monomorphize(&constant.literal);
-                if let ty::ConstKind::Value(value) = const_.val {
-                    Ok(value)
-                } else {
-                    span_bug!(constant.span, "encountered bad ConstKind in codegen: {:?}", const_);
-                }
-            }
+            _ => span_bug!(
+                constant.span,
+                "encountered bad ConstKind after monomorphizing: {:?}",
+                const_
+            ),
         }
     }