diff options
| author | Tyler Mandry <tmandry@gmail.com> | 2020-08-14 14:46:59 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-08-14 14:46:59 -0700 |
| commit | 00e2dcbcda89dc3066388bbd9910ecfcc724c48e (patch) | |
| tree | 9e49d61044b6ec7b37138093a606a2805e5589f7 /src | |
| parent | 83c04392c891405065c02d024a7f9677032c8587 (diff) | |
| parent | d0d9048d6ced47e95d90c0213dc3b35f979bbb40 (diff) | |
| download | rust-00e2dcbcda89dc3066388bbd9910ecfcc724c48e.tar.gz rust-00e2dcbcda89dc3066388bbd9910ecfcc724c48e.zip | |
Rollup merge of #75517 - RalfJung:promo-intern-comments, r=oli-obk
Promotion and const interning comments I understood some things today which I felt should be put into comments. Cc @rust-lang/wg-const-eval
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_mir/const_eval/eval_queries.rs | 6 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/intern.rs | 3 | ||||
| -rw-r--r-- | src/librustc_mir/transform/promote_consts.rs | 2 |
3 files changed, 9 insertions, 2 deletions
diff --git a/src/librustc_mir/const_eval/eval_queries.rs b/src/librustc_mir/const_eval/eval_queries.rs index 7fbe5c409d3..4101f70b820 100644 --- a/src/librustc_mir/const_eval/eval_queries.rs +++ b/src/librustc_mir/const_eval/eval_queries.rs @@ -57,6 +57,12 @@ fn eval_body_using_ecx<'mir, 'tcx>( ecx.run()?; // Intern the result + // FIXME: since the DefId of a promoted is the DefId of its owner, this + // means that promoteds in statics are actually interned like statics! + // However, this is also currently crucial because we promote mutable + // non-empty slices in statics to extend their lifetime, and this + // ensures that they are put into a mutable allocation. + // For other kinds of promoteds in statics (like array initializers), this is rather silly. let intern_kind = match tcx.static_mutability(cid.instance.def_id()) { Some(m) => InternKind::Static(m), None if cid.promoted.is_some() => InternKind::Promoted, diff --git a/src/librustc_mir/interpret/intern.rs b/src/librustc_mir/interpret/intern.rs index dffbc969c21..6c8ee72bc66 100644 --- a/src/librustc_mir/interpret/intern.rs +++ b/src/librustc_mir/interpret/intern.rs @@ -312,7 +312,8 @@ pub fn intern_const_alloc_recursive<M: CompileTimeMachine<'mir, 'tcx>>( let tcx = ecx.tcx; let base_intern_mode = match intern_kind { InternKind::Static(mutbl) => InternMode::Static(mutbl), - // FIXME: what about array lengths, array initializers? + // `Constant` includes array lengths. + // `Promoted` includes non-`Copy` array initializers and `rustc_args_required_const` arguments. InternKind::Constant | InternKind::Promoted => InternMode::ConstBase, }; diff --git a/src/librustc_mir/transform/promote_consts.rs b/src/librustc_mir/transform/promote_consts.rs index c0564105701..94637bae44a 100644 --- a/src/librustc_mir/transform/promote_consts.rs +++ b/src/librustc_mir/transform/promote_consts.rs @@ -101,7 +101,7 @@ impl TempState { /// of a larger candidate. #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum Candidate { - /// Borrow of a constant temporary. + /// Borrow of a constant temporary, candidate for lifetime extension. Ref(Location), /// Promotion of the `x` in `[x; 32]`. |
