During inlining, the callee body is normalized and has types revealed,
but some of locals corresponding to the arguments might come from the
caller body which is not. As a result the caller body does not pass
validation without additional normalization.
}
}
TerminatorKind::Call { func, args, destination, cleanup, .. } => {
+ let param_env = self.param_env.with_reveal_all_normalized(self.tcx);
let func_ty = func.ty(&self.body.local_decls, self.tcx);
+ let func_ty = self.tcx.normalize_erasing_regions(param_env, func_ty);
match func_ty.kind() {
ty::FnPtr(..) | ty::FnDef(..) => {}
_ => self.fail(
-// revisions: default miropt
-//[miropt]compile-flags: -Z mir-opt-level=2
-// ~^ This flag is for #77668, it used to be ICE.
-
#![crate_type = "lib"]
pub fn bar<P>( // Error won't happen if "bar" is not generic
-// run-pass
+// Regression test for various issues related to normalization & inlining.
+// * #68347, #77306, #77668 - missed normalization during inlining.
+// * #78442 - missed normalization in validator after inlining.
+//
+// build-pass
// compile-flags:-Zmir-opt-level=2
-// Previously ICEd because we did not normalize during inlining,
-// see https://github.com/rust-lang/rust/pull/77306 for more discussion.
-
pub fn write() {
create()()
}
+pub fn write_generic<T>(_t: T) {
+ hide()();
+}
+
pub fn create() -> impl FnOnce() {
|| ()
}
+pub fn hide() -> impl Fn() {
+ write
+}
+
fn main() {
write();
+ write_generic(());
}