Skip to content

Commit 333899a

Browse files
authored
Rollup merge of #66182 - RalfJung:invalid-value, r=Centril
invalid_value lint: fix help text Now that we also warn about `MaybUninit::uninit().assume_init()`, just telling people "use `MaybeUninit`" isn't always sufficient. And anyway this seems like an important enough point to mention it here.
2 parents a96811e + a5be036 commit 333899a

File tree

2 files changed

+37
-36
lines changed

2 files changed

+37
-36
lines changed

src/librustc_lint/builtin.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2052,7 +2052,8 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for InvalidValue {
20522052
);
20532053
err.span_label(expr.span,
20542054
"this code causes undefined behavior when executed");
2055-
err.span_label(expr.span, "help: use `MaybeUninit<T>` instead");
2055+
err.span_label(expr.span, "help: use `MaybeUninit<T>` instead, \
2056+
and only call `assume_init` after initialization is done");
20562057
if let Some(span) = span {
20572058
err.span_note(span, &msg);
20582059
} else {

src/test/ui/lint/uninitialized-zeroed.stderr

+35-35
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ LL | let _val: &'static T = mem::zeroed();
55
| ^^^^^^^^^^^^^
66
| |
77
| this code causes undefined behavior when executed
8-
| help: use `MaybeUninit<T>` instead
8+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
99
|
1010
note: lint level defined here
1111
--> $DIR/uninitialized-zeroed.rs:7:9
@@ -21,7 +21,7 @@ LL | let _val: &'static T = mem::uninitialized();
2121
| ^^^^^^^^^^^^^^^^^^^^
2222
| |
2323
| this code causes undefined behavior when executed
24-
| help: use `MaybeUninit<T>` instead
24+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
2525
|
2626
= note: References must be non-null
2727

@@ -32,7 +32,7 @@ LL | let _val: Wrap<&'static T> = mem::zeroed();
3232
| ^^^^^^^^^^^^^
3333
| |
3434
| this code causes undefined behavior when executed
35-
| help: use `MaybeUninit<T>` instead
35+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
3636
|
3737
note: References must be non-null (in this struct field)
3838
--> $DIR/uninitialized-zeroed.rs:18:18
@@ -47,7 +47,7 @@ LL | let _val: Wrap<&'static T> = mem::uninitialized();
4747
| ^^^^^^^^^^^^^^^^^^^^
4848
| |
4949
| this code causes undefined behavior when executed
50-
| help: use `MaybeUninit<T>` instead
50+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
5151
|
5252
note: References must be non-null (in this struct field)
5353
--> $DIR/uninitialized-zeroed.rs:18:18
@@ -62,7 +62,7 @@ LL | let _val: ! = mem::zeroed();
6262
| ^^^^^^^^^^^^^
6363
| |
6464
| this code causes undefined behavior when executed
65-
| help: use `MaybeUninit<T>` instead
65+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
6666
|
6767
= note: The never type (`!`) has no valid value
6868

@@ -73,7 +73,7 @@ LL | let _val: ! = mem::uninitialized();
7373
| ^^^^^^^^^^^^^^^^^^^^
7474
| |
7575
| this code causes undefined behavior when executed
76-
| help: use `MaybeUninit<T>` instead
76+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
7777
|
7878
= note: The never type (`!`) has no valid value
7979

@@ -84,7 +84,7 @@ LL | let _val: (i32, !) = mem::zeroed();
8484
| ^^^^^^^^^^^^^
8585
| |
8686
| this code causes undefined behavior when executed
87-
| help: use `MaybeUninit<T>` instead
87+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
8888
|
8989
= note: The never type (`!`) has no valid value
9090

@@ -95,7 +95,7 @@ LL | let _val: (i32, !) = mem::uninitialized();
9595
| ^^^^^^^^^^^^^^^^^^^^
9696
| |
9797
| this code causes undefined behavior when executed
98-
| help: use `MaybeUninit<T>` instead
98+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
9999
|
100100
= note: The never type (`!`) has no valid value
101101

@@ -106,7 +106,7 @@ LL | let _val: Void = mem::zeroed();
106106
| ^^^^^^^^^^^^^
107107
| |
108108
| this code causes undefined behavior when executed
109-
| help: use `MaybeUninit<T>` instead
109+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
110110
|
111111
= note: 0-variant enums have no valid value
112112

@@ -117,7 +117,7 @@ LL | let _val: Void = mem::uninitialized();
117117
| ^^^^^^^^^^^^^^^^^^^^
118118
| |
119119
| this code causes undefined behavior when executed
120-
| help: use `MaybeUninit<T>` instead
120+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
121121
|
122122
= note: 0-variant enums have no valid value
123123

@@ -128,7 +128,7 @@ LL | let _val: &'static i32 = mem::zeroed();
128128
| ^^^^^^^^^^^^^
129129
| |
130130
| this code causes undefined behavior when executed
131-
| help: use `MaybeUninit<T>` instead
131+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
132132
|
133133
= note: References must be non-null
134134

@@ -139,7 +139,7 @@ LL | let _val: &'static i32 = mem::uninitialized();
139139
| ^^^^^^^^^^^^^^^^^^^^
140140
| |
141141
| this code causes undefined behavior when executed
142-
| help: use `MaybeUninit<T>` instead
142+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
143143
|
144144
= note: References must be non-null
145145

@@ -150,7 +150,7 @@ LL | let _val: Ref = mem::zeroed();
150150
| ^^^^^^^^^^^^^
151151
| |
152152
| this code causes undefined behavior when executed
153-
| help: use `MaybeUninit<T>` instead
153+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
154154
|
155155
note: References must be non-null (in this struct field)
156156
--> $DIR/uninitialized-zeroed.rs:15:12
@@ -165,7 +165,7 @@ LL | let _val: Ref = mem::uninitialized();
165165
| ^^^^^^^^^^^^^^^^^^^^
166166
| |
167167
| this code causes undefined behavior when executed
168-
| help: use `MaybeUninit<T>` instead
168+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
169169
|
170170
note: References must be non-null (in this struct field)
171171
--> $DIR/uninitialized-zeroed.rs:15:12
@@ -180,7 +180,7 @@ LL | let _val: fn() = mem::zeroed();
180180
| ^^^^^^^^^^^^^
181181
| |
182182
| this code causes undefined behavior when executed
183-
| help: use `MaybeUninit<T>` instead
183+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
184184
|
185185
= note: Function pointers must be non-null
186186

@@ -191,7 +191,7 @@ LL | let _val: fn() = mem::uninitialized();
191191
| ^^^^^^^^^^^^^^^^^^^^
192192
| |
193193
| this code causes undefined behavior when executed
194-
| help: use `MaybeUninit<T>` instead
194+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
195195
|
196196
= note: Function pointers must be non-null
197197

@@ -202,7 +202,7 @@ LL | let _val: Wrap<fn()> = mem::zeroed();
202202
| ^^^^^^^^^^^^^
203203
| |
204204
| this code causes undefined behavior when executed
205-
| help: use `MaybeUninit<T>` instead
205+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
206206
|
207207
note: Function pointers must be non-null (in this struct field)
208208
--> $DIR/uninitialized-zeroed.rs:18:18
@@ -217,7 +217,7 @@ LL | let _val: Wrap<fn()> = mem::uninitialized();
217217
| ^^^^^^^^^^^^^^^^^^^^
218218
| |
219219
| this code causes undefined behavior when executed
220-
| help: use `MaybeUninit<T>` instead
220+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
221221
|
222222
note: Function pointers must be non-null (in this struct field)
223223
--> $DIR/uninitialized-zeroed.rs:18:18
@@ -232,7 +232,7 @@ LL | let _val: WrapEnum<fn()> = mem::zeroed();
232232
| ^^^^^^^^^^^^^
233233
| |
234234
| this code causes undefined behavior when executed
235-
| help: use `MaybeUninit<T>` instead
235+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
236236
|
237237
note: Function pointers must be non-null (in this enum field)
238238
--> $DIR/uninitialized-zeroed.rs:19:28
@@ -247,7 +247,7 @@ LL | let _val: WrapEnum<fn()> = mem::uninitialized();
247247
| ^^^^^^^^^^^^^^^^^^^^
248248
| |
249249
| this code causes undefined behavior when executed
250-
| help: use `MaybeUninit<T>` instead
250+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
251251
|
252252
note: Function pointers must be non-null (in this enum field)
253253
--> $DIR/uninitialized-zeroed.rs:19:28
@@ -262,7 +262,7 @@ LL | let _val: Wrap<(RefPair, i32)> = mem::zeroed();
262262
| ^^^^^^^^^^^^^
263263
| |
264264
| this code causes undefined behavior when executed
265-
| help: use `MaybeUninit<T>` instead
265+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
266266
|
267267
note: References must be non-null (in this struct field)
268268
--> $DIR/uninitialized-zeroed.rs:16:16
@@ -277,7 +277,7 @@ LL | let _val: Wrap<(RefPair, i32)> = mem::uninitialized();
277277
| ^^^^^^^^^^^^^^^^^^^^
278278
| |
279279
| this code causes undefined behavior when executed
280-
| help: use `MaybeUninit<T>` instead
280+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
281281
|
282282
note: References must be non-null (in this struct field)
283283
--> $DIR/uninitialized-zeroed.rs:16:16
@@ -292,7 +292,7 @@ LL | let _val: NonNull<i32> = mem::zeroed();
292292
| ^^^^^^^^^^^^^
293293
| |
294294
| this code causes undefined behavior when executed
295-
| help: use `MaybeUninit<T>` instead
295+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
296296
|
297297
= note: std::ptr::NonNull<i32> must be non-null
298298

@@ -303,7 +303,7 @@ LL | let _val: NonNull<i32> = mem::uninitialized();
303303
| ^^^^^^^^^^^^^^^^^^^^
304304
| |
305305
| this code causes undefined behavior when executed
306-
| help: use `MaybeUninit<T>` instead
306+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
307307
|
308308
= note: std::ptr::NonNull<i32> must be non-null
309309

@@ -314,7 +314,7 @@ LL | let _val: *const dyn Send = mem::zeroed();
314314
| ^^^^^^^^^^^^^
315315
| |
316316
| this code causes undefined behavior when executed
317-
| help: use `MaybeUninit<T>` instead
317+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
318318
|
319319
= note: The vtable of a wide raw pointer must be non-null
320320

@@ -325,7 +325,7 @@ LL | let _val: *const dyn Send = mem::uninitialized();
325325
| ^^^^^^^^^^^^^^^^^^^^
326326
| |
327327
| this code causes undefined behavior when executed
328-
| help: use `MaybeUninit<T>` instead
328+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
329329
|
330330
= note: The vtable of a wide raw pointer must be non-null
331331

@@ -336,7 +336,7 @@ LL | let _val: bool = mem::uninitialized();
336336
| ^^^^^^^^^^^^^^^^^^^^
337337
| |
338338
| this code causes undefined behavior when executed
339-
| help: use `MaybeUninit<T>` instead
339+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
340340
|
341341
= note: Booleans must be `true` or `false`
342342

@@ -347,7 +347,7 @@ LL | let _val: Wrap<char> = mem::uninitialized();
347347
| ^^^^^^^^^^^^^^^^^^^^
348348
| |
349349
| this code causes undefined behavior when executed
350-
| help: use `MaybeUninit<T>` instead
350+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
351351
|
352352
note: Characters must be a valid unicode codepoint (in this struct field)
353353
--> $DIR/uninitialized-zeroed.rs:18:18
@@ -362,7 +362,7 @@ LL | let _val: NonBig = mem::uninitialized();
362362
| ^^^^^^^^^^^^^^^^^^^^
363363
| |
364364
| this code causes undefined behavior when executed
365-
| help: use `MaybeUninit<T>` instead
365+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
366366
|
367367
= note: NonBig must be initialized inside its custom valid range
368368

@@ -373,7 +373,7 @@ LL | let _val: &'static i32 = mem::transmute(0usize);
373373
| ^^^^^^^^^^^^^^^^^^^^^^
374374
| |
375375
| this code causes undefined behavior when executed
376-
| help: use `MaybeUninit<T>` instead
376+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
377377
|
378378
= note: References must be non-null
379379

@@ -384,7 +384,7 @@ LL | let _val: &'static [i32] = mem::transmute((0usize, 0usize));
384384
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
385385
| |
386386
| this code causes undefined behavior when executed
387-
| help: use `MaybeUninit<T>` instead
387+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
388388
|
389389
= note: References must be non-null
390390

@@ -395,7 +395,7 @@ LL | let _val: NonZeroU32 = mem::transmute(0);
395395
| ^^^^^^^^^^^^^^^^^
396396
| |
397397
| this code causes undefined behavior when executed
398-
| help: use `MaybeUninit<T>` instead
398+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
399399
|
400400
= note: std::num::NonZeroU32 must be non-null
401401

@@ -406,7 +406,7 @@ LL | let _val: NonNull<i32> = MaybeUninit::zeroed().assume_init();
406406
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
407407
| |
408408
| this code causes undefined behavior when executed
409-
| help: use `MaybeUninit<T>` instead
409+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
410410
|
411411
= note: std::ptr::NonNull<i32> must be non-null
412412

@@ -417,7 +417,7 @@ LL | let _val: NonNull<i32> = MaybeUninit::uninit().assume_init();
417417
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
418418
| |
419419
| this code causes undefined behavior when executed
420-
| help: use `MaybeUninit<T>` instead
420+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
421421
|
422422
= note: std::ptr::NonNull<i32> must be non-null
423423

@@ -428,7 +428,7 @@ LL | let _val: bool = MaybeUninit::uninit().assume_init();
428428
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
429429
| |
430430
| this code causes undefined behavior when executed
431-
| help: use `MaybeUninit<T>` instead
431+
| help: use `MaybeUninit<T>` instead, and only call `assume_init` after initialization is done
432432
|
433433
= note: Booleans must be `true` or `false`
434434

0 commit comments

Comments
 (0)