| //@ 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); |
| } |