1 //! Various data structures used by the Rust compiler. The intention 2 //! is that code in here should be not be *specific* to rustc, so that 3 //! it can be easily unit tested and so forth. 4 //! 5 //! # Note 6 //! 7 //! This API is completely unstable and subject to change. 8 9 #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] 10 #![feature(array_windows)] 11 #![feature(control_flow_enum)] 12 #![feature(in_band_lifetimes)] 13 #![feature(unboxed_closures)] 14 #![feature(generator_trait)] 15 #![feature(fn_traits)] 16 #![feature(min_specialization)] 17 #![feature(auto_traits)] 18 #![feature(nll)] 19 #![feature(allow_internal_unstable)] 20 #![feature(hash_raw_entry)] 21 #![feature(stmt_expr_attributes)] 22 #![feature(core_intrinsics)] 23 #![feature(test)] 24 #![feature(associated_type_bounds)] 25 #![feature(thread_id_value)] 26 #![feature(extend_one)] 27 #![feature(const_panic)] 28 #![feature(new_uninit)] 29 #![feature(once_cell)] 30 #![feature(maybe_uninit_uninit_array)] 31 #![allow(rustc::default_hash_types)] 32 #![deny(unaligned_references)] 33 34 #[macro_use] 35 extern crate tracing; 36 #[macro_use] 37 extern crate cfg_if; 38 #[macro_use] 39 extern crate rustc_macros; 40 41 #[inline(never)] 42 #[cold] cold_path<F: FnOnce() -> R, R>(f: F) -> R43pub fn cold_path<F: FnOnce() -> R, R>(f: F) -> R { 44 f() 45 } 46 47 #[macro_export] 48 macro_rules! likely { 49 ($e:expr) => { 50 match $e { 51 #[allow(unused_unsafe)] 52 e => unsafe { std::intrinsics::likely(e) }, 53 } 54 }; 55 } 56 57 #[macro_export] 58 macro_rules! unlikely { 59 ($e:expr) => { 60 match $e { 61 #[allow(unused_unsafe)] 62 e => unsafe { std::intrinsics::unlikely(e) }, 63 } 64 }; 65 } 66 67 pub mod base_n; 68 pub mod binary_search_util; 69 pub mod box_region; 70 pub mod captures; 71 pub mod flock; 72 pub mod functor; 73 pub mod fx; 74 pub mod graph; 75 pub mod jobserver; 76 pub mod macros; 77 pub mod map_in_place; 78 pub mod obligation_forest; 79 pub mod owning_ref; 80 pub mod ptr_key; 81 pub mod sip128; 82 pub mod small_c_str; 83 pub mod snapshot_map; 84 pub mod stable_map; 85 pub mod svh; 86 pub use ena::snapshot_vec; 87 pub mod memmap; 88 pub mod sorted_map; 89 pub mod stable_set; 90 #[macro_use] 91 pub mod stable_hasher; 92 mod atomic_ref; 93 pub mod fingerprint; 94 pub mod profiling; 95 pub mod sharded; 96 pub mod stack; 97 pub mod sync; 98 pub mod thin_vec; 99 pub mod tiny_list; 100 pub mod transitive_relation; 101 pub mod vec_linked_list; 102 pub mod work_queue; 103 pub use atomic_ref::AtomicRef; 104 pub mod frozen; 105 pub mod sso; 106 pub mod steal; 107 pub mod tagged_ptr; 108 pub mod temp_dir; 109 pub mod unhash; 110 111 pub use ena::undo_log; 112 pub use ena::unify; 113 114 pub struct OnDrop<F: Fn()>(pub F); 115 116 impl<F: Fn()> OnDrop<F> { 117 /// Forgets the function which prevents it from running. 118 /// Ensure that the function owns no memory, otherwise it will be leaked. 119 #[inline] disable(self)120 pub fn disable(self) { 121 std::mem::forget(self); 122 } 123 } 124 125 impl<F: Fn()> Drop for OnDrop<F> { 126 #[inline] drop(&mut self)127 fn drop(&mut self) { 128 (self.0)(); 129 } 130 } 131 132 // See comments in src/librustc_middle/lib.rs 133 #[doc(hidden)] __noop_fix_for_27438()134pub fn __noop_fix_for_27438() {} 135