Change:
Derived from <!-- TRIAGEBOTSTART --<!-- TRIAGEBOTASSIGNSTART --This issue has been assigned to via . <!-- TRIAGEBOTASSIGNDATASTARTTRIAGEBOTASSIGNDATAEND --<!-- TRIAGEBOTASSIGNEND --<!-- TRIAGEBOTEND --
It works with . (at least for cg_clif) Edit: works with too.
<details<summaryMir of the second example (-Zmir-opt-level=2)</summary</details<details<summaryMir of the second example (-Zmir-opt-level=3)</summary</details
modify labels: +A-mir +C-bug
This is only miscompiled when const prop runs.
Bisected to . I'm a relatively new contributor, but I'd like to try and see if I can fix this. claim

Discussion:
self.check_binary_op(*op, left, right, source_info, place_layout, overflow_check)?; } <del> // Work around: avoid ICE in miri. FIXME(wesleywiser) // The Miri engine ICEs when taking a reference to an uninitialized unsized // local. There's nothing it can do here: taking a reference needs an allocation // which needs to know the size. Normally that's okay as during execution // (e.g. for CTFE) it can never happen. But here in const_prop // unknown data is uninitialized, so if e.g. a function argument is unsized // and has a reference taken, we get an ICE. </del> <ins> // Do not try creating references (#67862) </ins> Rvalue::Ref(_, _, place_ref) => { <del> trace!("checking Ref({:?})", place_ref); </del> <ins> trace!("skipping Ref({:?})", place_ref); </ins> <del> if let Some(local) = place_ref.as_local() { let alive = if let LocalValue::Live(_) = self.ecx.frame().locals[local].value { true } else { false }; if !alive { trace!("skipping Ref({:?}) to uninitialized local", place); return None; } } </del> <ins> return None; </ins> } _ => {}

fn main() { <del> *(&(4, 5).1); </del> <ins> *(&(4, 5).1); // This does not currently propagate (#67862) </ins> } // END RUST SOURCE

//     ... //     _4 = const main::promoted[0]; //     _2 = &((*_4).1: i32); <del> //     _1 = const 5i32; </del> <ins> //     _1 = (*_2); </ins> //     ... // } // END rustc.main.ConstProp.after.mir

<ins> // compile-flags: -Z mir-opt-level=2 // run-pass struct Baz<T: ?Sized> { a: T } fn main() { let d : Baz<[i32; 4]> = Baz { a: [1,2,3,4] }; assert_eq!([1, 2, 3, 4], d.a); } </ins>

<ins> // compile-flags: -Z mir-opt-level=3 // run-pass struct X { x: isize } fn f1(a: &mut X, b: &mut isize, c: isize) -> isize { let r = a.x + *b + c; a.x = 0; *b = 10; return r; } fn f2<F>(a: isize, f: F) -> isize where F: FnOnce(isize) { f(1); return a; } pub fn main() { let mut a = X {x: 1}; let mut b = 2; let c = 3; assert_eq!(f1(&mut a, &mut b, c), 6); assert_eq!(a.x, 0); assert_eq!(f2(a.x, |_| a.x = 50), 0); } </ins>

<ins> // compile-flags: -Z mir-opt-level=2 // run-pass use std::cell::Cell; #[derive(Debug)] struct B<'a> { a: [Cell<Option<&'a B<'a>>>; 2] } impl<'a> B<'a> { fn new() -> B<'a> { B { a: [Cell::new(None), Cell::new(None)] } } } fn f() { let b2 = B::new(); b2.a[0].set(Some(&b2)); } fn main() { f(); } </ins>

<ins> // compile-flags: -Z mir-opt-level=2 // run-pass fn e220() -> (i64, i64) { #[inline(never)] fn get_displacement() -> [i64; 2] { [139776, 963904] } let res = get_displacement(); match (&res[0], &res[1]) { (arg0, arg1) => (*arg0, *arg1), } } fn main() { assert_eq!(e220(), (139776, 963904)); } </ins>