@@ -33,16 +33,6 @@ fn lazy_default() {
33
33
assert_eq ! ( CALLED . load( SeqCst ) , 1 ) ;
34
34
}
35
35
36
- #[ test]
37
- #[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
38
- fn lazy_poisoning ( ) {
39
- let x: LazyCell < String > = LazyCell :: new ( || panic ! ( "kaboom" ) ) ;
40
- for _ in 0 ..2 {
41
- let res = panic:: catch_unwind ( panic:: AssertUnwindSafe ( || x. len ( ) ) ) ;
42
- assert ! ( res. is_err( ) ) ;
43
- }
44
- }
45
-
46
36
#[ test]
47
37
#[ cfg_attr( any( target_os = "emscripten" , target_os = "wasi" ) , ignore) ] // no threads
48
38
fn sync_lazy_new ( ) {
@@ -123,16 +113,6 @@ fn static_sync_lazy_via_fn() {
123
113
assert_eq ! ( xs( ) , & vec![ 1 , 2 , 3 ] ) ;
124
114
}
125
115
126
- #[ test]
127
- #[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
128
- fn sync_lazy_poisoning ( ) {
129
- let x: LazyLock < String > = LazyLock :: new ( || panic ! ( "kaboom" ) ) ;
130
- for _ in 0 ..2 {
131
- let res = panic:: catch_unwind ( || x. len ( ) ) ;
132
- assert ! ( res. is_err( ) ) ;
133
- }
134
- }
135
-
136
116
// Check that we can infer `T` from closure's type.
137
117
#[ test]
138
118
fn lazy_type_inference ( ) {
@@ -145,17 +125,6 @@ fn is_sync_send() {
145
125
assert_traits :: < LazyLock < String > > ( ) ;
146
126
}
147
127
148
- #[ test]
149
- #[ should_panic = "has previously been poisoned" ]
150
- fn lazy_force_mut_panic ( ) {
151
- let mut lazy = LazyLock :: < String > :: new ( || panic ! ( ) ) ;
152
- panic:: catch_unwind ( panic:: AssertUnwindSafe ( || {
153
- let _ = LazyLock :: force_mut ( & mut lazy) ;
154
- } ) )
155
- . unwrap_err ( ) ;
156
- let _ = & * lazy;
157
- }
158
-
159
128
#[ test]
160
129
fn lazy_force_mut ( ) {
161
130
let s = "abc" . to_owned ( ) ;
@@ -165,3 +134,56 @@ fn lazy_force_mut() {
165
134
p. clear ( ) ;
166
135
LazyLock :: force_mut ( & mut lazy) ;
167
136
}
137
+
138
+ #[ test]
139
+ #[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
140
+ fn lazy_poisoning ( ) {
141
+ let x: LazyCell < String > = LazyCell :: new ( || panic ! ( "kaboom" ) ) ;
142
+ for _ in 0 ..2 {
143
+ let res = panic:: catch_unwind ( panic:: AssertUnwindSafe ( || x. len ( ) ) ) ;
144
+ assert ! ( res. is_err( ) ) ;
145
+ }
146
+ }
147
+
148
+ /// Verifies that when a `LazyLock` is poisoned, it panics with the correct error message ("LazyLock
149
+ /// instance has previously been poisoned") instead of the underlying `Once` error message.
150
+ #[ test]
151
+ #[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
152
+ #[ should_panic( expected = "LazyLock instance has previously been poisoned" ) ]
153
+ fn lazy_lock_deref_panic ( ) {
154
+ let lazy: LazyLock < String > = LazyLock :: new ( || panic ! ( "initialization failed" ) ) ;
155
+
156
+ // First access will panic during initialization.
157
+ let _ = panic:: catch_unwind ( panic:: AssertUnwindSafe ( || {
158
+ let _ = & * lazy;
159
+ } ) ) ;
160
+
161
+ // Second access should panic with the poisoned message.
162
+ let _ = & * lazy;
163
+ }
164
+
165
+ #[ test]
166
+ #[ should_panic( expected = "LazyLock instance has previously been poisoned" ) ]
167
+ fn lazy_lock_deref_mut_panic ( ) {
168
+ let mut lazy: LazyLock < String > = LazyLock :: new ( || panic ! ( "initialization failed" ) ) ;
169
+
170
+ // First access will panic during initialization.
171
+ let _ = panic:: catch_unwind ( panic:: AssertUnwindSafe ( || {
172
+ let _ = LazyLock :: force_mut ( & mut lazy) ;
173
+ } ) ) ;
174
+
175
+ // Second access should panic with the poisoned message.
176
+ let _ = & * lazy;
177
+ }
178
+
179
+ /// Verifies that when the initialization closure panics with a custom message, that message is
180
+ /// preserved and not overridden by `LazyLock`.
181
+ #[ test]
182
+ #[ cfg_attr( not( panic = "unwind" ) , ignore = "test requires unwinding support" ) ]
183
+ #[ should_panic( expected = "custom panic message from closure" ) ]
184
+ fn lazy_lock_preserves_closure_panic_message ( ) {
185
+ let lazy: LazyLock < String > = LazyLock :: new ( || panic ! ( "custom panic message from closure" ) ) ;
186
+
187
+ // This should panic with the original message from the closure.
188
+ let _ = & * lazy;
189
+ }
0 commit comments