@@ -230,6 +230,14 @@ impl fmt::Display for AccessError {
230
230
#[ stable( feature = "thread_local_try_with" , since = "1.26.0" ) ]
231
231
impl Error for AccessError { }
232
232
233
+ // This ensures the panicking code is outlined from `with` for `LocalKey`.
234
+ #[ cfg_attr( not( feature = "panic_immediate_abort" ) , inline( never) ) ]
235
+ #[ track_caller]
236
+ #[ cold]
237
+ fn panic_access_error ( err : AccessError ) -> ! {
238
+ panic ! ( "cannot access a Thread Local Storage value during or after destruction: {err:?}" )
239
+ }
240
+
233
241
impl < T : ' static > LocalKey < T > {
234
242
#[ doc( hidden) ]
235
243
#[ unstable(
@@ -269,10 +277,10 @@ impl<T: 'static> LocalKey<T> {
269
277
where
270
278
F : FnOnce ( & T ) -> R ,
271
279
{
272
- self . try_with ( f) . expect (
273
- "cannot access a Thread Local Storage value \
274
- during or after destruction" ,
275
- )
280
+ match self . try_with ( f) {
281
+ Ok ( r ) => r ,
282
+ Err ( err ) => panic_access_error ( err ) ,
283
+ }
276
284
}
277
285
278
286
/// Acquires a reference to the value in this TLS key.
@@ -327,10 +335,10 @@ impl<T: 'static> LocalKey<T> {
327
335
let mut init = Some ( init) ;
328
336
329
337
let reference = unsafe {
330
- ( self . inner ) ( Some ( & mut init) ) . as_ref ( ) . expect (
331
- "cannot access a Thread Local Storage value \
332
- during or after destruction" ,
333
- )
338
+ match ( self . inner ) ( Some ( & mut init) ) . as_ref ( ) {
339
+ Some ( r ) => r ,
340
+ None => panic_access_error ( AccessError ) ,
341
+ }
334
342
} ;
335
343
336
344
f ( init, reference)
0 commit comments