#![feature(unicode)]
#![feature(rustc_diagnostic_macros)]
-#![feature(match_default_bindings)]
+#![cfg_attr(stage0, feature(match_default_bindings))]
#![feature(non_exhaustive)]
-#![feature(i128_type)]
+#![cfg_attr(stage0, feature(i128_type))]
#![feature(const_atomic_usize_new)]
#![feature(rustc_attrs)]
pub extern crate rustc_errors as errors;
extern crate syntax_pos;
extern crate rustc_data_structures;
+#[macro_use] extern crate scoped_tls;
extern crate serialize as rustc_serialize; // used by deriving
+use rustc_data_structures::sync::Lock;
+
// A variant of 'try!' that panics on an Err. This is used as a crutch on the
// way towards a non-panic!-prone parser. It should be used for fatal parsing
// errors; eventually we plan to convert all code using panictry to just use
}
}
+struct Globals {
+ used_attrs: Lock<Vec<u64>>,
+ known_attrs: Lock<Vec<u64>>,
+ syntax_pos_globals: syntax_pos::Globals,
+}
+
+impl Globals {
+ fn new() -> Globals {
+ Globals {
+ used_attrs: Lock::new(Vec::new()),
+ known_attrs: Lock::new(Vec::new()),
+ syntax_pos_globals: syntax_pos::Globals::new(),
+ }
+ }
+}
+
+pub fn with_globals<F, R>(f: F) -> R
+ where F: FnOnce() -> R
+{
+ let globals = Globals::new();
+ GLOBALS.set(&globals, || {
+ syntax_pos::GLOBALS.set(&globals.syntax_pos_globals, f)
+ })
+}
+
+scoped_thread_local!(static GLOBALS: Globals);
+
#[macro_use]
pub mod diagnostics {
#[macro_use]
#[macro_use]
pub mod config;
pub mod entry;
-pub mod epoch;
+pub mod edition;
pub mod feature_gate;
pub mod fold;
pub mod parse;