@@ -106,6 +106,7 @@ impl<T: 'static> fmt::Debug for LocalKey<T> {
106106 }
107107}
108108
109+ #[ cfg( not( stage0) ) ]
109110/// Declare a new thread local storage key of type `std::thread::LocalKey`.
110111///
111112/// # Syntax
@@ -145,6 +146,7 @@ macro_rules! thread_local {
145146 ) ;
146147}
147148
149+ #[ cfg( not( stage0) ) ]
148150#[ doc( hidden) ]
149151#[ unstable( feature = "thread_local_internals" ,
150152 reason = "should not be necessary" ,
@@ -177,6 +179,71 @@ macro_rules! __thread_local_inner {
177179 }
178180}
179181
182+ #[ cfg( stage0) ]
183+ /// Declare a new thread local storage key of type `std::thread::LocalKey`.
184+ #[ macro_export]
185+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
186+ #[ allow_internal_unstable]
187+ macro_rules! thread_local {
188+ // rule 0: empty (base case for the recursion)
189+ ( ) => { } ;
190+
191+ // rule 1: process multiple declarations where the first one is private
192+ ( $( #[ $attr: meta] ) * static $name: ident: $t: ty = $init: expr; $( $rest: tt) * ) => (
193+ thread_local!( $( #[ $attr] ) * static $name: $t = $init) ; // go to rule 2
194+ thread_local!( $( $rest) * ) ;
195+ ) ;
196+
197+ // rule 2: handle a single private declaration
198+ ( $( #[ $attr: meta] ) * static $name: ident: $t: ty = $init: expr) => (
199+ $( #[ $attr] ) * static $name: $crate:: thread:: LocalKey <$t> =
200+ __thread_local_inner!( $t, $init) ;
201+ ) ;
202+
203+ // rule 3: handle multiple declarations where the first one is public
204+ ( $( #[ $attr: meta] ) * pub static $name: ident: $t: ty = $init: expr; $( $rest: tt) * ) => (
205+ thread_local!( $( #[ $attr] ) * pub static $name: $t = $init) ; // go to rule 4
206+ thread_local!( $( $rest) * ) ;
207+ ) ;
208+
209+ // rule 4: handle a single public declaration
210+ ( $( #[ $attr: meta] ) * pub static $name: ident: $t: ty = $init: expr) => (
211+ $( #[ $attr] ) * pub static $name: $crate:: thread:: LocalKey <$t> =
212+ __thread_local_inner!( $t, $init) ;
213+ ) ;
214+ }
215+
216+ #[ cfg( stage0) ]
217+ #[ doc( hidden) ]
218+ #[ unstable( feature = "thread_local_internals" ,
219+ reason = "should not be necessary" ,
220+ issue = "0" ) ]
221+ #[ macro_export]
222+ #[ allow_internal_unstable]
223+ macro_rules! __thread_local_inner {
224+ ( $t: ty, $init: expr) => { {
225+ fn __init( ) -> $t { $init }
226+
227+ fn __getit( ) -> $crate:: option:: Option <
228+ & ' static $crate:: cell:: UnsafeCell <
229+ $crate:: option:: Option <$t>>>
230+ {
231+ #[ thread_local]
232+ #[ cfg( target_thread_local) ]
233+ static __KEY: $crate:: thread:: __FastLocalKeyInner<$t> =
234+ $crate:: thread:: __FastLocalKeyInner:: new( ) ;
235+
236+ #[ cfg( not( target_thread_local) ) ]
237+ static __KEY: $crate:: thread:: __OsLocalKeyInner<$t> =
238+ $crate:: thread:: __OsLocalKeyInner:: new( ) ;
239+
240+ __KEY. get( )
241+ }
242+
243+ $crate:: thread:: LocalKey :: new( __getit, __init)
244+ } }
245+ }
246+
180247/// Indicator of the state of a thread local storage key.
181248#[ unstable( feature = "thread_local_state" ,
182249 reason = "state querying was recently added" ,
0 commit comments