about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Scherer <github35764891676564198441@oli-obk.de>2020-01-16 16:18:08 +0100
committerOliver Scherer <github35764891676564198441@oli-obk.de>2020-01-16 16:18:08 +0100
commiteed0d33a65bd3f315bdf2d26511676f61e95120e (patch)
treeff2d247f667783c0cfd7ff67c63c2841003f6163
parent9fe05e9456b84996637c2f29b35c37960e537540 (diff)
downloadrust-eed0d33a65bd3f315bdf2d26511676f61e95120e.tar.gz
rust-eed0d33a65bd3f315bdf2d26511676f61e95120e.zip
Array repeat expression lengths must be monomorphic at MIR building time
-rw-r--r--src/librustc_mir_build/hair/cx/expr.rs27
-rw-r--r--src/test/ui/consts/associated_const_generic.rs25
2 files changed, 40 insertions, 12 deletions
diff --git a/src/librustc_mir_build/hair/cx/expr.rs b/src/librustc_mir_build/hair/cx/expr.rs
index 97e71811829..d6786ea2479 100644
--- a/src/librustc_mir_build/hair/cx/expr.rs
+++ b/src/librustc_mir_build/hair/cx/expr.rs
@@ -411,18 +411,21 @@ fn make_mirror_unadjusted<'a, 'tcx>(
             let def_id = cx.tcx.hir().local_def_id(count.hir_id);
             let substs = InternalSubsts::identity_for_item(cx.tcx, def_id);
             let span = cx.tcx.def_span(def_id);
-            let count =
-                match cx.tcx.const_eval_resolve(cx.param_env, def_id, substs, None, Some(span)) {
-                    Ok(cv) => cv.eval_usize(cx.tcx, cx.param_env),
-                    Err(ErrorHandled::Reported) => 0,
-                    Err(ErrorHandled::TooGeneric) => {
-                        let span = cx.tcx.def_span(def_id);
-                        cx.tcx
-                            .sess
-                            .span_err(span, "array lengths can't depend on generic parameters");
-                        0
-                    }
-                };
+            let count = match cx.tcx.const_eval_resolve(
+                ty::ParamEnv::reveal_all(),
+                def_id,
+                substs,
+                None,
+                Some(span),
+            ) {
+                Ok(cv) => cv.eval_usize(cx.tcx, ty::ParamEnv::reveal_all()),
+                Err(ErrorHandled::Reported) => 0,
+                Err(ErrorHandled::TooGeneric) => {
+                    let span = cx.tcx.def_span(def_id);
+                    cx.tcx.sess.span_err(span, "array lengths can't depend on generic parameters");
+                    0
+                }
+            };
 
             ExprKind::Repeat { value: v.to_ref(), count }
         }
diff --git a/src/test/ui/consts/associated_const_generic.rs b/src/test/ui/consts/associated_const_generic.rs
new file mode 100644
index 00000000000..dee376cc17b
--- /dev/null
+++ b/src/test/ui/consts/associated_const_generic.rs
@@ -0,0 +1,25 @@
+// check-pass
+
+trait TraitA {
+    const VALUE: usize;
+}
+
+struct A;
+impl TraitA for A {
+    const VALUE: usize = 1;
+}
+
+trait TraitB {
+    type MyA: TraitA;
+    const VALUE: usize = Self::MyA::VALUE;
+}
+
+struct B;
+impl TraitB for B {
+    type MyA = A;
+}
+
+fn main() {
+    let _ = [0; A::VALUE];
+    let _ = [0; B::VALUE]; // Indirectly refers to `A::VALUE`
+}