@@ -188,8 +188,9 @@ impl<'tcx> From<InterpError<'tcx>> for InterpErrorInfo<'tcx> {
188
188
}
189
189
190
190
/// Error information for when the program we executed turned out not to actually be a valid
191
- /// program. This cannot happen in stand-alone Miri, but it can happen during CTFE/ConstProp
192
- /// where we work on generic code or execution does not have all information available.
191
+ /// program. This cannot happen in stand-alone Miri (except for layout errors that are only detect
192
+ /// during monomorphization), but it can happen during CTFE/ConstProp where we work on generic code
193
+ /// or execution does not have all information available.
193
194
#[ derive( Debug ) ]
194
195
pub enum InvalidProgramInfo < ' tcx > {
195
196
/// Resolution can fail if we are in a too generic context.
@@ -507,7 +508,7 @@ pub enum ValidationErrorKind<'tcx> {
507
508
/// Miri engine, e.g., CTFE does not support dereferencing pointers at integral addresses.
508
509
#[ derive( Debug ) ]
509
510
pub enum UnsupportedOpInfo {
510
- /// Free-form case. Only for errors that are never caught!
511
+ /// Free-form case. Only for errors that are never caught! Used by Miri.
511
512
// FIXME still use translatable diagnostics
512
513
Unsupported ( String ) ,
513
514
/// Unsized local variables.
@@ -592,3 +593,117 @@ impl InterpError<'_> {
592
593
)
593
594
}
594
595
}
596
+
597
+ // Macros for constructing / throwing `InterpError`
598
+ #[ macro_export]
599
+ macro_rules! err_unsup {
600
+ ( $( $tt: tt) * ) => {
601
+ $crate:: mir:: interpret:: InterpError :: Unsupported (
602
+ $crate:: mir:: interpret:: UnsupportedOpInfo :: $( $tt) *
603
+ )
604
+ } ;
605
+ }
606
+
607
+ #[ macro_export]
608
+ macro_rules! err_unsup_format {
609
+ ( $( $tt: tt) * ) => { $crate:: err_unsup!( Unsupported ( format!( $( $tt) * ) ) ) } ;
610
+ }
611
+
612
+ #[ macro_export]
613
+ macro_rules! err_inval {
614
+ ( $( $tt: tt) * ) => {
615
+ $crate:: mir:: interpret:: InterpError :: InvalidProgram (
616
+ $crate:: mir:: interpret:: InvalidProgramInfo :: $( $tt) *
617
+ )
618
+ } ;
619
+ }
620
+
621
+ #[ macro_export]
622
+ macro_rules! err_ub {
623
+ ( $( $tt: tt) * ) => {
624
+ $crate:: mir:: interpret:: InterpError :: UndefinedBehavior (
625
+ $crate:: mir:: interpret:: UndefinedBehaviorInfo :: $( $tt) *
626
+ )
627
+ } ;
628
+ }
629
+
630
+ #[ macro_export]
631
+ macro_rules! err_ub_format {
632
+ ( $( $tt: tt) * ) => { $crate:: err_ub!( Ub ( format!( $( $tt) * ) ) ) } ;
633
+ }
634
+
635
+ #[ macro_export]
636
+ macro_rules! err_ub_custom {
637
+ ( $msg: expr $( , $( $name: ident = $value: expr) ,* $( , ) ?) ?) => { {
638
+ $(
639
+ let ( $( $name, ) * ) = ( $( $value, ) * ) ;
640
+ ) ?
641
+ $crate:: err_ub!( Custom (
642
+ $crate:: error:: CustomSubdiagnostic {
643
+ msg: || $msg,
644
+ add_args: Box :: new( move |mut set_arg| {
645
+ $( $(
646
+ set_arg( stringify!( $name) . into( ) , rustc_errors:: IntoDiagArg :: into_diag_arg( $name) ) ;
647
+ ) * ) ?
648
+ } )
649
+ }
650
+ ) )
651
+ } } ;
652
+ }
653
+
654
+ #[ macro_export]
655
+ macro_rules! err_exhaust {
656
+ ( $( $tt: tt) * ) => {
657
+ $crate:: mir:: interpret:: InterpError :: ResourceExhaustion (
658
+ $crate:: mir:: interpret:: ResourceExhaustionInfo :: $( $tt) *
659
+ )
660
+ } ;
661
+ }
662
+
663
+ #[ macro_export]
664
+ macro_rules! err_machine_stop {
665
+ ( $( $tt: tt) * ) => {
666
+ $crate:: mir:: interpret:: InterpError :: MachineStop ( Box :: new( $( $tt) * ) )
667
+ } ;
668
+ }
669
+
670
+ // In the `throw_*` macros, avoid `return` to make them work with `try {}`.
671
+ #[ macro_export]
672
+ macro_rules! throw_unsup {
673
+ ( $( $tt: tt) * ) => { do yeet $crate:: err_unsup!( $( $tt) * ) } ;
674
+ }
675
+
676
+ #[ macro_export]
677
+ macro_rules! throw_unsup_format {
678
+ ( $( $tt: tt) * ) => { do yeet $crate:: err_unsup_format!( $( $tt) * ) } ;
679
+ }
680
+
681
+ #[ macro_export]
682
+ macro_rules! throw_inval {
683
+ ( $( $tt: tt) * ) => { do yeet $crate:: err_inval!( $( $tt) * ) } ;
684
+ }
685
+
686
+ #[ macro_export]
687
+ macro_rules! throw_ub {
688
+ ( $( $tt: tt) * ) => { do yeet $crate:: err_ub!( $( $tt) * ) } ;
689
+ }
690
+
691
+ #[ macro_export]
692
+ macro_rules! throw_ub_format {
693
+ ( $( $tt: tt) * ) => { do yeet $crate:: err_ub_format!( $( $tt) * ) } ;
694
+ }
695
+
696
+ #[ macro_export]
697
+ macro_rules! throw_ub_custom {
698
+ ( $( $tt: tt) * ) => { do yeet $crate:: err_ub_custom!( $( $tt) * ) } ;
699
+ }
700
+
701
+ #[ macro_export]
702
+ macro_rules! throw_exhaust {
703
+ ( $( $tt: tt) * ) => { do yeet $crate:: err_exhaust!( $( $tt) * ) } ;
704
+ }
705
+
706
+ #[ macro_export]
707
+ macro_rules! throw_machine_stop {
708
+ ( $( $tt: tt) * ) => { do yeet $crate:: err_machine_stop!( $( $tt) * ) } ;
709
+ }
0 commit comments