// Copyright 2017 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. use std::ops::Deref; struct ArenaSet::Target>(U, &'static V) where V: 'static + ?Sized; static Z: [u8; 4] = [1,2,3,4]; fn arena() -> &'static ArenaSet> { fn __static_ref_initialize() -> ArenaSet> { ArenaSet(vec![], &Z) } unsafe { use std::sync::{Once, ONCE_INIT}; fn require_sync(_: &T) { } unsafe fn __stability() -> &'static ArenaSet> { use std::mem::transmute; use std::boxed::Box; static mut DATA: *const ArenaSet> = 0 as *const ArenaSet>; static mut ONCE: Once = ONCE_INIT; ONCE.call_once(|| { DATA = transmute ::>>, *const ArenaSet>> (Box::new(__static_ref_initialize())); }); &*DATA } let static_ref = __stability(); require_sync(static_ref); static_ref } } fn main() { let &ArenaSet(ref u, v) = arena(); assert!(u.is_empty()); assert_eq!(v, Z); }