about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSantiago Pastorino <spastorino@gmail.com>2020-04-05 14:09:45 -0300
committerSantiago Pastorino <spastorino@gmail.com>2020-04-23 16:50:17 -0300
commit5313e2e9296fc1b13e7f1eda3aa5f63dc1e7ce9a (patch)
tree284ee5f5b185768c8f459b07ff2644919f42a424
parentdb18b42343a080024279a0e44b785594dcaf8667 (diff)
downloadrust-5313e2e9296fc1b13e7f1eda3aa5f63dc1e7ce9a.tar.gz
rust-5313e2e9296fc1b13e7f1eda3aa5f63dc1e7ce9a.zip
Make inlining carry over unevaluated consts
-rw-r--r--src/librustc_mir/transform/inline.rs10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs
index d8bb8a0b52c..0408818b798 100644
--- a/src/librustc_mir/transform/inline.rs
+++ b/src/librustc_mir/transform/inline.rs
@@ -8,7 +8,7 @@ use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
 use rustc_middle::mir::visit::*;
 use rustc_middle::mir::*;
 use rustc_middle::ty::subst::{Subst, SubstsRef};
-use rustc_middle::ty::{self, Instance, InstanceDef, ParamEnv, Ty, TyCtxt};
+use rustc_middle::ty::{self, ConstKind, Instance, InstanceDef, ParamEnv, Ty, TyCtxt};
 use rustc_session::config::Sanitizer;
 use rustc_target::spec::abi::Abi;
 
@@ -123,6 +123,14 @@ impl Inliner<'tcx> {
                     continue;
                 };
 
+                // Copy only unevaluated constants from the callee_body into the caller_body.
+                // Although we are only pushing `ConstKind::Unevaluated` consts to uneval_consts,
+                // here we may not only have `ConstKind::Unevaluated` because we are calling
+                // `subst_and_normalize_erasing_regions`.
+                caller_body.uneval_consts.extend(callee_body.uneval_consts.iter().copied().filter(
+                    |&constant| matches!(constant.literal.val, ConstKind::Unevaluated(_, _, _)),
+                ));
+
                 let start = caller_body.basic_blocks().len();
                 debug!("attempting to inline callsite {:?} - body={:?}", callsite, callee_body);
                 if !self.inline_call(callsite, caller_body, callee_body) {