about summary refs log tree commit diff
path: root/src
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
parent98803c182b2ba6ef5dccb6bf501958249295eac0 (diff)
downloadrust-0c5c3bbdabc60bd7dd7491dfcf6befb8202d7521.tar.gz
rust-0c5c3bbdabc60bd7dd7491dfcf6befb8202d7521.zip
handle unevaluated consts after monomophize
Diffstat (limited to 'src')
-rw-r--r--src/librustc_codegen_ssa/mir/constant.rs47
-rw-r--r--src/test/ui/const-generics/issues/issue-70125.rs19
-rw-r--r--src/test/ui/const-generics/issues/issue-70125.stderr8
-rw-r--r--src/test/ui/const-generics/normalization_failure.rs16
-rw-r--r--src/test/ui/const-generics/normalization_failure.stderr8
5 files changed, 77 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_
+            ),
         }
     }
 
diff --git a/src/test/ui/const-generics/issues/issue-70125.rs b/src/test/ui/const-generics/issues/issue-70125.rs
new file mode 100644
index 00000000000..8b933c078ff
--- /dev/null
+++ b/src/test/ui/const-generics/issues/issue-70125.rs
@@ -0,0 +1,19 @@
+// run-pass
+#![feature(const_generics)]
+//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
+
+const L: usize = 4;
+
+pub trait Print<const N: usize> {
+    fn print(&self) -> usize {
+        N
+    }
+}
+
+pub struct Printer;
+impl Print<L> for Printer {}
+
+fn main() {
+    let p = Printer;
+    assert_eq!(p.print(), 4);
+}
diff --git a/src/test/ui/const-generics/issues/issue-70125.stderr b/src/test/ui/const-generics/issues/issue-70125.stderr
new file mode 100644
index 00000000000..878ed7628e8
--- /dev/null
+++ b/src/test/ui/const-generics/issues/issue-70125.stderr
@@ -0,0 +1,8 @@
+warning: the feature `const_generics` is incomplete and may cause the compiler to crash
+  --> $DIR/issue-70125.rs:2:12
+   |
+LL | #![feature(const_generics)]
+   |            ^^^^^^^^^^^^^^
+   |
+   = note: `#[warn(incomplete_features)]` on by default
+
diff --git a/src/test/ui/const-generics/normalization_failure.rs b/src/test/ui/const-generics/normalization_failure.rs
new file mode 100644
index 00000000000..ea7a68c2f93
--- /dev/null
+++ b/src/test/ui/const-generics/normalization_failure.rs
@@ -0,0 +1,16 @@
+// run-pass
+
+#![feature(const_generics)]
+//~^ WARN the feature `const_generics` is incomplete and may cause the compiler to crash
+
+fn main() {
+    <()>::foo();
+}
+
+trait Foo<const X: usize> {
+    fn foo() -> usize {
+        X
+    }
+}
+
+impl Foo<{3}> for () {}
diff --git a/src/test/ui/const-generics/normalization_failure.stderr b/src/test/ui/const-generics/normalization_failure.stderr
new file mode 100644
index 00000000000..d5ad39e81ba
--- /dev/null
+++ b/src/test/ui/const-generics/normalization_failure.stderr
@@ -0,0 +1,8 @@
+warning: the feature `const_generics` is incomplete and may cause the compiler to crash
+  --> $DIR/normalization_failure.rs:3:12
+   |
+LL | #![feature(const_generics)]
+   |            ^^^^^^^^^^^^^^
+   |
+   = note: `#[warn(incomplete_features)]` on by default
+