diff options
| author | bors <bors@rust-lang.org> | 2020-01-17 12:25:07 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-01-17 12:25:07 +0000 |
| commit | 71c6346aa1afa5a0d246649d4919e11311e635f2 (patch) | |
| tree | 4bd895b28b641ba41f8b0e52ab9100f39000e565 | |
| parent | 2480c9eac15608591f58730aed27caac9c30b4c2 (diff) | |
| parent | eed0d33a65bd3f315bdf2d26511676f61e95120e (diff) | |
| download | rust-71c6346aa1afa5a0d246649d4919e11311e635f2.tar.gz rust-71c6346aa1afa5a0d246649d4919e11311e635f2.zip | |
Auto merge of #68285 - oli-obk:specialization_regression, r=davidtwco
Array repeat expression lengths must be monomorphic at MIR building time fixes #67743
| -rw-r--r-- | src/librustc_mir_build/hair/cx/expr.rs | 27 | ||||
| -rw-r--r-- | src/test/ui/consts/associated_const_generic.rs | 25 |
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` +} |
