@@ -366,7 +366,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
366
366
let place = try_validation ! (
367
367
self . ecx. ref_to_mplace( value) ,
368
368
self . path,
369
- err_ub!( InvalidUninitBytes { .. } ) => { "uninitialized {}" , kind } ,
369
+ err_ub!( InvalidUninitBytes ( None ) ) => { "uninitialized {}" , kind } ,
370
370
) ;
371
371
if place. layout . is_unsized ( ) {
372
372
self . check_wide_ptr_meta ( place. meta , place. layout ) ?;
@@ -477,7 +477,8 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
477
477
try_validation ! (
478
478
value. to_bool( ) ,
479
479
self . path,
480
- err_ub!( InvalidBool ( ..) ) => { "{}" , value } expected { "a boolean" } ,
480
+ err_ub!( InvalidBool ( ..) ) | err_ub!( InvalidUninitBytes ( None ) ) =>
481
+ { "{}" , value } expected { "a boolean" } ,
481
482
) ;
482
483
Ok ( true )
483
484
}
@@ -486,7 +487,8 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
486
487
try_validation ! (
487
488
value. to_char( ) ,
488
489
self . path,
489
- err_ub!( InvalidChar ( ..) ) => { "{}" , value } expected { "a valid unicode scalar value (in `0..=0x10FFFF` but not in `0xD800..=0xDFFF`)" } ,
490
+ err_ub!( InvalidChar ( ..) ) | err_ub!( InvalidUninitBytes ( None ) ) =>
491
+ { "{}" , value } expected { "a valid unicode scalar value (in `0..=0x10FFFF` but not in `0xD800..=0xDFFF`)" } ,
490
492
) ;
491
493
Ok ( true )
492
494
}
@@ -515,7 +517,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
515
517
let place = try_validation ! (
516
518
self . ecx. ref_to_mplace( self . ecx. read_immediate( value) ?) ,
517
519
self . path,
518
- err_ub!( InvalidUninitBytes { .. } ) => { "uninitialized raw pointer" } ,
520
+ err_ub!( InvalidUninitBytes ( None ) ) => { "uninitialized raw pointer" } ,
519
521
) ;
520
522
if place. layout . is_unsized ( ) {
521
523
self . check_wide_ptr_meta ( place. meta , place. layout ) ?;
@@ -537,6 +539,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
537
539
self . path,
538
540
err_ub!( DanglingIntPointer ( ..) ) |
539
541
err_ub!( InvalidFunctionPointer ( ..) ) |
542
+ err_ub!( InvalidUninitBytes ( None ) ) |
540
543
err_unsup!( ReadBytesAsPointer ) =>
541
544
{ "{}" , value } expected { "a function pointer" } ,
542
545
) ;
@@ -593,7 +596,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, '
593
596
let value = try_validation ! (
594
597
value. not_undef( ) ,
595
598
self . path,
596
- err_ub!( InvalidUninitBytes { .. } ) => { "{}" , value }
599
+ err_ub!( InvalidUninitBytes ( None ) ) => { "{}" , value }
597
600
expected { "something {}" , wrapping_range_format( valid_range, max_hi) } ,
598
601
) ;
599
602
let bits = match value. to_bits_or_ptr ( op. layout . size , self . ecx ) {
@@ -699,6 +702,9 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M>
699
702
self . path,
700
703
err_ub!( InvalidTag ( val) ) =>
701
704
{ "{}" , val } expected { "a valid enum tag" } ,
705
+ // `InvalidUninitBytes` can be caused by `read_discriminant` in Miri if all initialized tags are valid.
706
+ err_ub!( InvalidUninitBytes ( None ) ) =>
707
+ { "uninitialized bytes" } expected { "a valid enum tag" } ,
702
708
err_unsup!( ReadPointerAsBytes ) =>
703
709
{ "a pointer" } expected { "plain (non-pointer) bytes" } ,
704
710
) ;
0 commit comments