use tokenstream::{TokenStream, TokenTree, Delimited};
use util::ThinVec;
-use std::cell::{RefCell, Cell};
+use std::cell::RefCell;
use std::iter;
thread_local! {
MetaItem { span: sp, name: name, node: MetaItemKind::Word }
}
+pub fn mk_attr_id() -> AttrId {
+ use std::sync::atomic::AtomicUsize;
+ use std::sync::atomic::Ordering;
+ static NEXT_ATTR_ID: AtomicUsize = AtomicUsize::new(0);
-thread_local! { static NEXT_ATTR_ID: Cell<usize> = Cell::new(0) }
-
-pub fn mk_attr_id() -> AttrId {
- let id = NEXT_ATTR_ID.with(|slot| {
- let r = slot.get();
- slot.set(r + 1);
- r
- });
+ let id = NEXT_ATTR_ID.fetch_add(1, Ordering::SeqCst);
+ assert!(id != ::std::usize::MAX);
AttrId(id)
}
#![feature(rustc_diagnostic_macros)]
#![feature(match_default_bindings)]
#![feature(i128_type)]
+#![feature(const_atomic_usize_new)]
// See librustc_cratesio_shim/Cargo.toml for a comment explaining this.
#[allow(unused_extern_crates)]