|  | //@ run-pass | 
|  | // Checks that functional-record-update order-of-eval is as expected | 
|  | // even when no Drop-implementations are involved. | 
|  |  | 
|  | use std::sync::atomic::{Ordering, AtomicUsize}; | 
|  |  | 
|  | struct W { wrapped: u32 } | 
|  | struct S { f0: W, _f1: i32 } | 
|  |  | 
|  | pub fn main() { | 
|  | const VAL: u32 = 0x89AB_CDEF; | 
|  | let w = W { wrapped: VAL }; | 
|  | let s = S { | 
|  | f0: { event(0x01); W { wrapped: w.wrapped + 1 } }, | 
|  | ..S { | 
|  | f0: { event(0x02); w}, | 
|  | _f1: 23 | 
|  | } | 
|  | }; | 
|  | assert_eq!(s.f0.wrapped, VAL + 1); | 
|  | let actual = event_log(); | 
|  | let expect = 0x01_02; | 
|  | assert!(expect == actual, | 
|  | "expect: 0x{:x} actual: 0x{:x}", expect, actual); | 
|  | } | 
|  |  | 
|  | static LOG: AtomicUsize = AtomicUsize::new(0); | 
|  |  | 
|  | fn event_log() -> usize { | 
|  | LOG.load(Ordering::SeqCst) | 
|  | } | 
|  |  | 
|  | fn event(tag: u8) { | 
|  | let old_log = LOG.load(Ordering::SeqCst); | 
|  | let new_log = (old_log << 8) + tag as usize; | 
|  | LOG.store(new_log, Ordering::SeqCst); | 
|  | } |