@@ -425,171 +425,180 @@ pub enum UnsupportedInfo<'tcx> {
425
425
PathNotFound ( Vec < String > ) ,
426
426
}
427
427
428
- #[ derive( Clone , RustcEncodable , RustcDecodable , HashStable ) ]
429
- pub enum ResourceExhaustionInfo {
430
- StackFrameLimitReached ,
431
- InfiniteLoop ,
432
- }
433
-
434
- impl fmt:: Debug for ResourceExhaustionInfo {
435
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
436
- use ResourceExhaustionInfo :: * ;
437
- match self {
438
- StackFrameLimitReached =>
439
- write ! ( f, "reached the configured maximum number of stack frames" ) ,
440
- InfiniteLoop =>
441
- write ! ( f, "duplicate interpreter state observed here, const evaluation will never \
442
- terminate") ,
443
- }
444
- }
445
- }
446
-
447
- #[ derive( Clone , RustcEncodable , RustcDecodable , HashStable ) ]
448
- pub enum InterpError < ' tcx > {
449
- /// The program panicked.
450
- Panic ( PanicMessage < u64 > ) ,
451
- /// The program caused undefined behavior.
452
- UndefinedBehaviour ( UndefinedBehaviourInfo ) ,
453
- /// The program did something the interpreter does not support (some of these *might* be UB
454
- /// but the interpreter is not sure).
455
- Unsupported ( UnsupportedInfo < ' tcx > ) ,
456
- /// The program was invalid (ill-typed, not sufficiently monomorphized, ...).
457
- InvalidProgram ( InvalidProgramInfo < ' tcx > ) ,
458
- /// The program exhausted the interpreter's resources (stack/heap too big,
459
- /// execution takes too long, ..).
460
- ResourceExhaustion ( ResourceExhaustionInfo ) ,
461
- /// Not actually an interpreter error -- used to signal that execution has exited
462
- /// with the given status code. Used by Miri, but not by CTFE.
463
- Exit ( i32 ) ,
464
- }
465
-
466
- pub type InterpResult < ' tcx , T = ( ) > = Result < T , InterpErrorInfo < ' tcx > > ;
467
-
468
- impl fmt:: Display for InterpError < ' _ > {
428
+ impl fmt:: Debug for UnsupportedInfo < ' tcx > {
469
429
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
470
- // Forward `Display` to `Debug`
471
- write ! ( f, "{:?}" , self )
472
- }
473
- }
474
-
475
- impl fmt:: Debug for InterpError < ' _ > {
476
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
477
- use InterpError :: * ;
478
430
use UnsupportedInfo :: * ;
479
- match * self {
480
- Unsupported ( PointerOutOfBounds { ptr, msg, allocation_size } ) => {
431
+ match self {
432
+ PointerOutOfBounds { ptr, msg, allocation_size } => {
481
433
write ! ( f, "{} failed: pointer must be in-bounds at offset {}, \
482
434
but is outside bounds of allocation {} which has size {}",
483
435
msg, ptr. offset. bytes( ) , ptr. alloc_id, allocation_size. bytes( ) )
484
436
} ,
485
- Unsupported ( ValidationFailure ( ref err) ) => {
437
+ ValidationFailure ( ref err) => {
486
438
write ! ( f, "type validation failed: {}" , err)
487
439
}
488
- Unsupported ( NoMirFor ( ref func) ) => write ! ( f, "no mir for `{}`" , func) ,
489
- Unsupported ( FunctionAbiMismatch ( caller_abi, callee_abi) ) =>
440
+ NoMirFor ( ref func) => write ! ( f, "no mir for `{}`" , func) ,
441
+ FunctionAbiMismatch ( caller_abi, callee_abi) =>
490
442
write ! ( f, "tried to call a function with ABI {:?} using caller ABI {:?}" ,
491
443
callee_abi, caller_abi) ,
492
- Unsupported ( FunctionArgMismatch ( caller_ty, callee_ty) ) =>
444
+ FunctionArgMismatch ( caller_ty, callee_ty) =>
493
445
write ! ( f, "tried to call a function with argument of type {:?} \
494
446
passing data of type {:?}",
495
447
callee_ty, caller_ty) ,
496
- Unsupported ( FunctionRetMismatch ( caller_ty, callee_ty) ) =>
448
+ FunctionRetMismatch ( caller_ty, callee_ty) =>
497
449
write ! ( f, "tried to call a function with return type {:?} \
498
450
passing return place of type {:?}",
499
451
callee_ty, caller_ty) ,
500
- Unsupported ( FunctionArgCountMismatch ) =>
452
+ FunctionArgCountMismatch =>
501
453
write ! ( f, "tried to call a function with incorrect number of arguments" ) ,
502
- Unsupported ( ReallocatedWrongMemoryKind ( ref old, ref new) ) =>
454
+ ReallocatedWrongMemoryKind ( ref old, ref new) =>
503
455
write ! ( f, "tried to reallocate memory from {} to {}" , old, new) ,
504
- Unsupported ( DeallocatedWrongMemoryKind ( ref old, ref new) ) =>
456
+ DeallocatedWrongMemoryKind ( ref old, ref new) =>
505
457
write ! ( f, "tried to deallocate {} memory but gave {} as the kind" , old, new) ,
506
- Unsupported ( InvalidChar ( c) ) =>
458
+ InvalidChar ( c) =>
507
459
write ! ( f, "tried to interpret an invalid 32-bit value as a char: {}" , c) ,
508
- Unsupported ( AlignmentCheckFailed { required, has } ) =>
460
+ AlignmentCheckFailed { required, has } =>
509
461
write ! ( f, "tried to access memory with alignment {}, but alignment {} is required" ,
510
462
has. bytes( ) , required. bytes( ) ) ,
511
- Unsupported ( TypeNotPrimitive ( ty) ) =>
463
+ TypeNotPrimitive ( ty) =>
512
464
write ! ( f, "expected primitive type, got {}" , ty) ,
513
- Unsupported ( PathNotFound ( ref path) ) =>
465
+ PathNotFound ( ref path) =>
514
466
write ! ( f, "Cannot find path {:?}" , path) ,
515
- Unsupported ( IncorrectAllocationInformation ( size, size2, align, align2) ) =>
467
+ IncorrectAllocationInformation ( size, size2, align, align2) =>
516
468
write ! ( f, "incorrect alloc info: expected size {} and align {}, \
517
469
got size {} and align {}",
518
470
size. bytes( ) , align. bytes( ) , size2. bytes( ) , align2. bytes( ) ) ,
519
- Unsupported ( InvalidDiscriminant ( val) ) =>
471
+ InvalidDiscriminant ( val) =>
520
472
write ! ( f, "encountered invalid enum discriminant {}" , val) ,
521
- Unsupported ( InvalidMemoryAccess ) =>
473
+ InvalidMemoryAccess =>
522
474
write ! ( f, "tried to access memory through an invalid pointer" ) ,
523
- Unsupported ( DanglingPointerDeref ) =>
475
+ DanglingPointerDeref =>
524
476
write ! ( f, "dangling pointer was dereferenced" ) ,
525
- Unsupported ( DoubleFree ) =>
477
+ DoubleFree =>
526
478
write ! ( f, "tried to deallocate dangling pointer" ) ,
527
- Unsupported ( InvalidFunctionPointer ) =>
479
+ InvalidFunctionPointer =>
528
480
write ! ( f, "tried to use a function pointer after offsetting it" ) ,
529
- Unsupported ( InvalidBool ) =>
481
+ InvalidBool =>
530
482
write ! ( f, "invalid boolean value read" ) ,
531
- Unsupported ( InvalidNullPointerUsage ) =>
483
+ InvalidNullPointerUsage =>
532
484
write ! ( f, "invalid use of NULL pointer" ) ,
533
- Unsupported ( ReadPointerAsBytes ) =>
485
+ ReadPointerAsBytes =>
534
486
write ! ( f, "a raw memory access tried to access part of a pointer value as raw \
535
487
bytes") ,
536
- Unsupported ( ReadBytesAsPointer ) =>
488
+ ReadBytesAsPointer =>
537
489
write ! ( f, "a memory access tried to interpret some bytes as a pointer" ) ,
538
- Unsupported ( ReadForeignStatic ) =>
490
+ ReadForeignStatic =>
539
491
write ! ( f, "tried to read from foreign (extern) static" ) ,
540
- Unsupported ( InvalidPointerMath ) =>
492
+ InvalidPointerMath =>
541
493
write ! ( f, "attempted to do invalid arithmetic on pointers that would leak base \
542
494
addresses, e.g., comparing pointers into different allocations") ,
543
- Unsupported ( DeadLocal ) =>
495
+ DeadLocal =>
544
496
write ! ( f, "tried to access a dead local variable" ) ,
545
- Unsupported ( DerefFunctionPointer ) =>
497
+ DerefFunctionPointer =>
546
498
write ! ( f, "tried to dereference a function pointer" ) ,
547
- Unsupported ( ExecuteMemory ) =>
499
+ ExecuteMemory =>
548
500
write ! ( f, "tried to treat a memory pointer as a function pointer" ) ,
549
- Unsupported ( OutOfTls ) =>
501
+ OutOfTls =>
550
502
write ! ( f, "reached the maximum number of representable TLS keys" ) ,
551
- Unsupported ( TlsOutOfBounds ) =>
503
+ TlsOutOfBounds =>
552
504
write ! ( f, "accessed an invalid (unallocated) TLS key" ) ,
553
- Unsupported ( CalledClosureAsFunction ) =>
505
+ CalledClosureAsFunction =>
554
506
write ! ( f, "tried to call a closure through a function pointer" ) ,
555
- Unsupported ( VtableForArgumentlessMethod ) =>
507
+ VtableForArgumentlessMethod =>
556
508
write ! ( f, "tried to call a vtable function without arguments" ) ,
557
- Unsupported ( ModifiedConstantMemory ) =>
509
+ ModifiedConstantMemory =>
558
510
write ! ( f, "tried to modify constant memory" ) ,
559
- Unsupported ( ModifiedStatic ) =>
511
+ ModifiedStatic =>
560
512
write ! ( f, "tried to modify a static's initial value from another static's \
561
513
initializer") ,
562
- Unsupported ( AssumptionNotHeld ) =>
514
+ AssumptionNotHeld =>
563
515
write ! ( f, "`assume` argument was false" ) ,
564
- Unsupported ( InlineAsm ) =>
516
+ InlineAsm =>
565
517
write ! ( f, "miri does not support inline assembly" ) ,
566
- Unsupported ( ReallocateNonBasePtr ) =>
518
+ ReallocateNonBasePtr =>
567
519
write ! ( f, "tried to reallocate with a pointer not to the beginning of an \
568
520
existing object") ,
569
- Unsupported ( DeallocateNonBasePtr ) =>
521
+ DeallocateNonBasePtr =>
570
522
write ! ( f, "tried to deallocate with a pointer not to the beginning of an \
571
523
existing object") ,
572
- Unsupported ( HeapAllocZeroBytes ) =>
524
+ HeapAllocZeroBytes =>
573
525
write ! ( f, "tried to re-, de- or allocate zero bytes on the heap" ) ,
574
- Unsupported ( ReadFromReturnPointer ) =>
526
+ ReadFromReturnPointer =>
575
527
write ! ( f, "tried to read from the return pointer" ) ,
576
- Unsupported ( UnimplementedTraitSelection ) =>
528
+ UnimplementedTraitSelection =>
577
529
write ! ( f, "there were unresolved type arguments during trait selection" ) ,
578
- Unsupported ( InvalidBoolOp ( _) ) =>
530
+ InvalidBoolOp ( _) =>
579
531
write ! ( f, "invalid boolean operation" ) ,
580
- Unsupported ( UnterminatedCString ( _) ) =>
532
+ UnterminatedCString ( _) =>
581
533
write ! ( f, "attempted to get length of a null terminated string, but no null \
582
534
found before end of allocation") ,
583
- Unsupported ( ReadUndefBytes ( _) ) =>
535
+ ReadUndefBytes ( _) =>
584
536
write ! ( f, "attempted to read undefined bytes" ) ,
585
- Unsupported ( HeapAllocNonPowerOfTwoAlignment ( _) ) =>
537
+ HeapAllocNonPowerOfTwoAlignment ( _) =>
586
538
write ! ( f, "tried to re-, de-, or allocate heap memory with alignment that is \
587
539
not a power of two") ,
588
- Unsupported ( MachineError ( ref msg) ) |
589
- Unsupported ( Unimplemented ( ref msg) ) |
590
- Unsupported ( AbiViolation ( ref msg) ) |
591
- Unsupported ( Intrinsic ( ref msg) ) =>
540
+ MachineError ( ref msg) |
541
+ Unimplemented ( ref msg) |
542
+ AbiViolation ( ref msg) |
543
+ Intrinsic ( ref msg) =>
592
544
write ! ( f, "{}" , msg) ,
545
+ }
546
+ }
547
+ }
548
+
549
+ #[ derive( Clone , RustcEncodable , RustcDecodable , HashStable ) ]
550
+ pub enum ResourceExhaustionInfo {
551
+ StackFrameLimitReached ,
552
+ InfiniteLoop ,
553
+ }
554
+
555
+ impl fmt:: Debug for ResourceExhaustionInfo {
556
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
557
+ use ResourceExhaustionInfo :: * ;
558
+ match self {
559
+ StackFrameLimitReached =>
560
+ write ! ( f, "reached the configured maximum number of stack frames" ) ,
561
+ InfiniteLoop =>
562
+ write ! ( f, "duplicate interpreter state observed here, const evaluation will never \
563
+ terminate") ,
564
+ }
565
+ }
566
+ }
567
+
568
+ #[ derive( Clone , RustcEncodable , RustcDecodable , HashStable ) ]
569
+ pub enum InterpError < ' tcx > {
570
+ /// The program panicked.
571
+ Panic ( PanicMessage < u64 > ) ,
572
+ /// The program caused undefined behavior.
573
+ UndefinedBehaviour ( UndefinedBehaviourInfo ) ,
574
+ /// The program did something the interpreter does not support (some of these *might* be UB
575
+ /// but the interpreter is not sure).
576
+ Unsupported ( UnsupportedInfo < ' tcx > ) ,
577
+ /// The program was invalid (ill-typed, not sufficiently monomorphized, ...).
578
+ InvalidProgram ( InvalidProgramInfo < ' tcx > ) ,
579
+ /// The program exhausted the interpreter's resources (stack/heap too big,
580
+ /// execution takes too long, ..).
581
+ ResourceExhaustion ( ResourceExhaustionInfo ) ,
582
+ /// Not actually an interpreter error -- used to signal that execution has exited
583
+ /// with the given status code. Used by Miri, but not by CTFE.
584
+ Exit ( i32 ) ,
585
+ }
586
+
587
+ pub type InterpResult < ' tcx , T = ( ) > = Result < T , InterpErrorInfo < ' tcx > > ;
588
+
589
+ impl fmt:: Display for InterpError < ' _ > {
590
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
591
+ // Forward `Display` to `Debug`
592
+ write ! ( f, "{:?}" , self )
593
+ }
594
+ }
595
+
596
+ impl fmt:: Debug for InterpError < ' _ > {
597
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
598
+ use InterpError :: * ;
599
+ match * self {
600
+ Unsupported ( ref msg) =>
601
+ write ! ( f, "{:?}" , msg) ,
593
602
InvalidProgram ( ref msg) =>
594
603
write ! ( f, "{:?}" , msg) ,
595
604
UndefinedBehaviour ( ref msg) =>
0 commit comments