@@ -3,8 +3,7 @@ use super::{AllocId, Pointer, RawConst, ScalarMaybeUndef};
3
3
use crate :: mir:: interpret:: ConstValue ;
4
4
use crate :: ty:: layout:: LayoutError ;
5
5
use crate :: ty:: query:: TyCtxtAt ;
6
- use crate :: ty:: tls;
7
- use crate :: ty:: { self , layout, Ty } ;
6
+ use crate :: ty:: { self , layout, tls, FnSig , Ty } ;
8
7
9
8
use rustc_data_structures:: sync:: Lock ;
10
9
use rustc_errors:: { struct_span_err, DiagnosticBuilder , ErrorReported } ;
@@ -329,7 +328,7 @@ impl fmt::Display for CheckInAllocMsg {
329
328
}
330
329
331
330
/// Error information for when the program caused Undefined Behavior.
332
- pub enum UndefinedBehaviorInfo {
331
+ pub enum UndefinedBehaviorInfo < ' tcx > {
333
332
/// Free-form case. Only for errors that are never caught!
334
333
Ub ( String ) ,
335
334
/// Unreachable code was executed.
@@ -347,6 +346,8 @@ pub enum UndefinedBehaviorInfo {
347
346
PointerArithOverflow ,
348
347
/// Invalid metadata in a wide pointer (using `str` to avoid allocations).
349
348
InvalidMeta ( & ' static str ) ,
349
+ /// Invalid drop function in vtable.
350
+ InvalidDropFn ( FnSig < ' tcx > ) ,
350
351
/// Reading a C string that does not end within its allocation.
351
352
UnterminatedCString ( Pointer ) ,
352
353
/// Dereferencing a dangling pointer after it got freed.
@@ -393,7 +394,7 @@ pub enum UndefinedBehaviorInfo {
393
394
} ,
394
395
}
395
396
396
- impl fmt:: Display for UndefinedBehaviorInfo {
397
+ impl fmt:: Display for UndefinedBehaviorInfo < ' _ > {
397
398
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
398
399
use UndefinedBehaviorInfo :: * ;
399
400
match self {
@@ -406,6 +407,11 @@ impl fmt::Display for UndefinedBehaviorInfo {
406
407
RemainderByZero => write ! ( f, "calculating the remainder with a divisor of zero" ) ,
407
408
PointerArithOverflow => write ! ( f, "overflowing in-bounds pointer arithmetic" ) ,
408
409
InvalidMeta ( msg) => write ! ( f, "invalid metadata in wide pointer: {}" , msg) ,
410
+ InvalidDropFn ( sig) => write ! (
411
+ f,
412
+ "invalid drop function signature: got {}, expected exactly one argument which must be a pointer type" ,
413
+ sig
414
+ ) ,
409
415
UnterminatedCString ( p) => write ! (
410
416
f,
411
417
"reading a null-terminated string starting at {} with no null found before end of allocation" ,
@@ -448,9 +454,7 @@ impl fmt::Display for UndefinedBehaviorInfo {
448
454
InvalidFunctionPointer ( p) => {
449
455
write ! ( f, "using {} as function pointer but it does not point to a function" , p)
450
456
}
451
- InvalidStr ( err) => {
452
- write ! ( f, "this string is not valid UTF-8: {}" , err)
453
- }
457
+ InvalidStr ( err) => write ! ( f, "this string is not valid UTF-8: {}" , err) ,
454
458
InvalidUndefBytes ( Some ( p) ) => write ! (
455
459
f,
456
460
"reading uninitialized memory at {}, but this operation requires initialized memory" ,
@@ -554,7 +558,7 @@ impl dyn MachineStopType {
554
558
555
559
pub enum InterpError < ' tcx > {
556
560
/// The program caused undefined behavior.
557
- UndefinedBehavior ( UndefinedBehaviorInfo ) ,
561
+ UndefinedBehavior ( UndefinedBehaviorInfo < ' tcx > ) ,
558
562
/// The program did something the interpreter does not support (some of these *might* be UB
559
563
/// but the interpreter is not sure).
560
564
Unsupported ( UnsupportedOpInfo ) ,
0 commit comments