Skip to content

Commit e27927d

Browse files
authored
Rollup merge of rust-lang#62927 - RalfJung:panic, r=oli-obk
use PanicMessage in MIR, kill InterpError::description r? @oli-obk @eddyb Cc @saleemjaffer rust-lang/const-eval#4
2 parents 0466237 + ff18786 commit e27927d

File tree

12 files changed

+241
-238
lines changed

12 files changed

+241
-238
lines changed

src/librustc/mir/interpret/error.rs

+163-174
Large diffs are not rendered by default.

src/librustc/mir/mod.rs

+19-12
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use crate::hir::def::{CtorKind, Namespace};
88
use crate::hir::def_id::DefId;
99
use crate::hir::{self, InlineAsm as HirInlineAsm};
10-
use crate::mir::interpret::{ConstValue, PanicMessage, InterpError::Panic, Scalar};
10+
use crate::mir::interpret::{ConstValue, PanicMessage, Scalar};
1111
use crate::mir::visit::MirVisitable;
1212
use crate::rustc_serialize as serialize;
1313
use crate::ty::adjustment::PointerCast;
@@ -3152,13 +3152,16 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> {
31523152
}
31533153
}
31543154
Assert { ref cond, expected, ref msg, target, cleanup } => {
3155-
let msg = if let Panic(PanicMessage::BoundsCheck { ref len, ref index }) = *msg {
3156-
Panic(PanicMessage::BoundsCheck {
3157-
len: len.fold_with(folder),
3158-
index: index.fold_with(folder),
3159-
})
3160-
} else {
3161-
msg.clone()
3155+
use PanicMessage::*;
3156+
let msg = match msg {
3157+
BoundsCheck { ref len, ref index } =>
3158+
BoundsCheck {
3159+
len: len.fold_with(folder),
3160+
index: index.fold_with(folder),
3161+
},
3162+
Panic { .. } | Overflow(_) | OverflowNeg | DivisionByZero | RemainderByZero |
3163+
GeneratorResumedAfterReturn | GeneratorResumedAfterPanic =>
3164+
msg.clone(),
31623165
};
31633166
Assert { cond: cond.fold_with(folder), expected, msg, target, cleanup }
31643167
}
@@ -3197,10 +3200,14 @@ impl<'tcx> TypeFoldable<'tcx> for Terminator<'tcx> {
31973200
}
31983201
Assert { ref cond, ref msg, .. } => {
31993202
if cond.visit_with(visitor) {
3200-
if let Panic(PanicMessage::BoundsCheck { ref len, ref index }) = *msg {
3201-
len.visit_with(visitor) || index.visit_with(visitor)
3202-
} else {
3203-
false
3203+
use PanicMessage::*;
3204+
match msg {
3205+
BoundsCheck { ref len, ref index } =>
3206+
len.visit_with(visitor) || index.visit_with(visitor),
3207+
Panic { .. } | Overflow(_) | OverflowNeg |
3208+
DivisionByZero | RemainderByZero |
3209+
GeneratorResumedAfterReturn | GeneratorResumedAfterPanic =>
3210+
false
32043211
}
32053212
} else {
32063213
false

src/librustc/mir/visit.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -514,11 +514,16 @@ macro_rules! make_mir_visitor {
514514
fn super_assert_message(&mut self,
515515
msg: & $($mutability)? AssertMessage<'tcx>,
516516
location: Location) {
517-
use crate::mir::interpret::InterpError::*;
518-
use crate::mir::interpret::PanicMessage::BoundsCheck;
519-
if let Panic(BoundsCheck { len, index }) = msg {
520-
self.visit_operand(len, location);
521-
self.visit_operand(index, location);
517+
use crate::mir::interpret::PanicMessage::*;
518+
match msg {
519+
BoundsCheck { len, index } => {
520+
self.visit_operand(len, location);
521+
self.visit_operand(index, location);
522+
}
523+
Panic { .. } | Overflow(_) | OverflowNeg | DivisionByZero | RemainderByZero |
524+
GeneratorResumedAfterReturn | GeneratorResumedAfterPanic => {
525+
// Nothing to visit
526+
}
522527
}
523528
}
524529

src/librustc_codegen_ssa/mir/block.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use rustc::middle::lang_items;
22
use rustc::ty::{self, Ty, TypeFoldable, Instance};
33
use rustc::ty::layout::{self, LayoutOf, HasTyCtxt, FnTypeExt};
44
use rustc::mir::{self, Place, PlaceBase, Static, StaticKind};
5-
use rustc::mir::interpret::{InterpError, PanicMessage};
5+
use rustc::mir::interpret::PanicMessage;
66
use rustc_target::abi::call::{ArgType, FnType, PassMode, IgnoreMode};
77
use rustc_target::spec::abi::Abi;
88
use crate::base;
@@ -368,7 +368,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
368368
// checked operation, just a comparison with the minimum
369369
// value, so we have to check for the assert message.
370370
if !bx.check_overflow() {
371-
if let InterpError::Panic(PanicMessage::OverflowNeg) = *msg {
371+
if let PanicMessage::OverflowNeg = *msg {
372372
const_cond = Some(expected);
373373
}
374374
}
@@ -402,8 +402,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
402402
let col = bx.const_u32(loc.col.to_usize() as u32 + 1);
403403

404404
// Put together the arguments to the panic entry point.
405-
let (lang_item, args) = match *msg {
406-
InterpError::Panic(PanicMessage::BoundsCheck { ref len, ref index }) => {
405+
let (lang_item, args) = match msg {
406+
PanicMessage::BoundsCheck { ref len, ref index } => {
407407
let len = self.codegen_operand(&mut bx, len).immediate();
408408
let index = self.codegen_operand(&mut bx, index).immediate();
409409

src/librustc_mir/borrow_check/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -733,8 +733,8 @@ impl<'cx, 'tcx> DataflowResultsConsumer<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tcx
733733
cleanup: _,
734734
} => {
735735
self.consume_operand(loc, (cond, span), flow_state);
736-
use rustc::mir::interpret::{InterpError::Panic, PanicMessage};
737-
if let Panic(PanicMessage::BoundsCheck { ref len, ref index }) = *msg {
736+
use rustc::mir::interpret::PanicMessage;
737+
if let PanicMessage::BoundsCheck { ref len, ref index } = *msg {
738738
self.consume_operand(loc, (len, span), flow_state);
739739
self.consume_operand(loc, (index, span), flow_state);
740740
}

src/librustc_mir/borrow_check/nll/invalidation.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> {
207207
cleanup: _,
208208
} => {
209209
self.consume_operand(location, cond);
210-
use rustc::mir::interpret::{InterpError::Panic, PanicMessage::BoundsCheck};
211-
if let Panic(BoundsCheck { ref len, ref index }) = *msg {
210+
use rustc::mir::interpret::PanicMessage;
211+
if let PanicMessage::BoundsCheck { ref len, ref index } = *msg {
212212
self.consume_operand(location, len);
213213
self.consume_operand(location, index);
214214
}

src/librustc_mir/borrow_check/nll/type_check/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use rustc::infer::canonical::QueryRegionConstraints;
2828
use rustc::infer::outlives::env::RegionBoundPairs;
2929
use rustc::infer::{InferCtxt, InferOk, LateBoundRegionConversionTime, NLLRegionVariableOrigin};
3030
use rustc::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
31-
use rustc::mir::interpret::{InterpError::Panic, ConstValue, PanicMessage};
31+
use rustc::mir::interpret::{ConstValue, PanicMessage};
3232
use rustc::mir::tcx::PlaceTy;
3333
use rustc::mir::visit::{PlaceContext, Visitor, NonMutatingUseContext};
3434
use rustc::mir::*;
@@ -1606,7 +1606,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
16061606
span_mirbug!(self, term, "bad Assert ({:?}, not bool", cond_ty);
16071607
}
16081608

1609-
if let Panic(PanicMessage::BoundsCheck { ref len, ref index }) = *msg {
1609+
if let PanicMessage::BoundsCheck { ref len, ref index } = *msg {
16101610
if len.ty(body, tcx) != tcx.types.usize {
16111611
span_mirbug!(self, len, "bounds-check length non-usize {:?}", len)
16121612
}

src/librustc_mir/build/expr/as_place.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::build::expr::category::Category;
44
use crate::build::ForGuard::{OutsideGuard, RefWithinGuard};
55
use crate::build::{BlockAnd, BlockAndExtension, Builder};
66
use crate::hair::*;
7-
use rustc::mir::interpret::{InterpError::Panic, PanicMessage::BoundsCheck};
7+
use rustc::mir::interpret::{PanicMessage::BoundsCheck};
88
use rustc::mir::*;
99
use rustc::ty::{CanonicalUserTypeAnnotation, Variance};
1010

@@ -105,10 +105,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
105105
),
106106
);
107107

108-
let msg = Panic(BoundsCheck {
108+
let msg = BoundsCheck {
109109
len: Operand::Move(len),
110110
index: Operand::Copy(Place::from(idx)),
111-
});
111+
};
112112
let success = this.assert(block, Operand::Move(lt), true, msg, expr_span);
113113
success.and(slice.index(idx))
114114
}

src/librustc_mir/build/expr/as_rvalue.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::build::expr::category::{Category, RvalueFunc};
77
use crate::build::{BlockAnd, BlockAndExtension, Builder};
88
use crate::hair::*;
99
use rustc::middle::region;
10-
use rustc::mir::interpret::{InterpError::Panic, PanicMessage};
10+
use rustc::mir::interpret::PanicMessage;
1111
use rustc::mir::*;
1212
use rustc::ty::{self, CanonicalUserTypeAnnotation, Ty, UpvarSubsts};
1313
use syntax_pos::Span;
@@ -101,7 +101,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
101101
block,
102102
Operand::Move(is_min),
103103
false,
104-
Panic(PanicMessage::OverflowNeg),
104+
PanicMessage::OverflowNeg,
105105
expr_span,
106106
);
107107
}
@@ -401,7 +401,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
401401
let val = result_value.clone().field(val_fld, ty);
402402
let of = result_value.field(of_fld, bool_ty);
403403

404-
let err = Panic(PanicMessage::Overflow(op));
404+
let err = PanicMessage::Overflow(op);
405405

406406
block = self.assert(block, Operand::Move(of), false, err, span);
407407

@@ -411,11 +411,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
411411
// Checking division and remainder is more complex, since we 1. always check
412412
// and 2. there are two possible failure cases, divide-by-zero and overflow.
413413

414-
let (zero_err, overflow_err) = if op == BinOp::Div {
415-
(Panic(PanicMessage::DivisionByZero), Panic(PanicMessage::Overflow(op)))
414+
let zero_err = if op == BinOp::Div {
415+
PanicMessage::DivisionByZero
416416
} else {
417-
(Panic(PanicMessage::RemainderByZero), Panic(PanicMessage::Overflow(op)))
417+
PanicMessage::RemainderByZero
418418
};
419+
let overflow_err = PanicMessage::Overflow(op);
419420

420421
// Check for / 0
421422
let is_zero = self.temp(bool_ty, span);

src/librustc_mir/interpret/terminator.rs

+19-16
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use syntax::source_map::Span;
77
use rustc_target::spec::abi::Abi;
88

99
use super::{
10-
InterpResult, PointerArithmetic, InterpError, Scalar, PanicMessage,
10+
InterpResult, PointerArithmetic, InterpError, Scalar,
1111
InterpCx, Machine, Immediate, OpTy, ImmTy, PlaceTy, MPlaceTy, StackPopCleanup, FnVal,
1212
};
1313

@@ -135,28 +135,31 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
135135
self.goto_block(Some(target))?;
136136
} else {
137137
// Compute error message
138-
use rustc::mir::interpret::InterpError::*;
139-
return match *msg {
140-
Panic(PanicMessage::BoundsCheck { ref len, ref index }) => {
138+
use rustc::mir::interpret::PanicMessage::*;
139+
return match msg {
140+
BoundsCheck { ref len, ref index } => {
141141
let len = self.read_immediate(self.eval_operand(len, None)?)
142142
.expect("can't eval len").to_scalar()?
143143
.to_bits(self.memory().pointer_size())? as u64;
144144
let index = self.read_immediate(self.eval_operand(index, None)?)
145145
.expect("can't eval index").to_scalar()?
146146
.to_bits(self.memory().pointer_size())? as u64;
147-
err!(Panic(PanicMessage::BoundsCheck { len, index }))
147+
err!(Panic(BoundsCheck { len, index }))
148148
}
149-
Panic(PanicMessage::Overflow(op)) =>
150-
Err(Panic(PanicMessage::Overflow(op)).into()),
151-
Panic(PanicMessage::OverflowNeg) =>
152-
Err(Panic(PanicMessage::OverflowNeg).into()),
153-
Panic(PanicMessage::DivisionByZero) =>
154-
Err(Panic(PanicMessage::DivisionByZero).into()),
155-
Panic(PanicMessage::RemainderByZero) =>
156-
Err(Panic(PanicMessage::RemainderByZero).into()),
157-
GeneratorResumedAfterReturn |
158-
GeneratorResumedAfterPanic => unimplemented!(),
159-
_ => bug!(),
149+
Overflow(op) =>
150+
err!(Panic(Overflow(*op))),
151+
OverflowNeg =>
152+
err!(Panic(OverflowNeg)),
153+
DivisionByZero =>
154+
err!(Panic(DivisionByZero)),
155+
RemainderByZero =>
156+
err!(Panic(RemainderByZero)),
157+
GeneratorResumedAfterReturn =>
158+
err!(Panic(GeneratorResumedAfterReturn)),
159+
GeneratorResumedAfterPanic =>
160+
err!(Panic(GeneratorResumedAfterPanic)),
161+
Panic { .. } =>
162+
bug!("`Panic` variant cannot occur in MIR"),
160163
};
161164
}
162165
}

src/librustc_mir/transform/const_prop.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use rustc::mir::{
1313
use rustc::mir::visit::{
1414
Visitor, PlaceContext, MutatingUseContext, MutVisitor, NonMutatingUseContext,
1515
};
16-
use rustc::mir::interpret::{InterpError::Panic, Scalar, GlobalId, InterpResult, PanicMessage};
16+
use rustc::mir::interpret::{Scalar, GlobalId, InterpResult, InterpError, PanicMessage};
1717
use rustc::ty::{self, Instance, ParamEnv, Ty, TyCtxt};
1818
use syntax_pos::{Span, DUMMY_SP};
1919
use rustc::ty::subst::InternalSubsts;
@@ -314,8 +314,6 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
314314
| HeapAllocNonPowerOfTwoAlignment(_)
315315
| Unreachable
316316
| ReadFromReturnPointer
317-
| GeneratorResumedAfterReturn
318-
| GeneratorResumedAfterPanic
319317
| ReferencedConstant
320318
| InfiniteLoop
321319
=> {
@@ -595,7 +593,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
595593
)
596594
} else {
597595
if overflow {
598-
let err = Panic(PanicMessage::Overflow(op)).into();
596+
let err = InterpError::Panic(PanicMessage::Overflow(op)).into();
599597
let _: Option<()> = self.use_ecx(source_info, |_| Err(err));
600598
return None;
601599
}
@@ -809,7 +807,7 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
809807
self.super_terminator(terminator, location);
810808
let source_info = terminator.source_info;
811809
match &mut terminator.kind {
812-
TerminatorKind::Assert { expected, msg, ref mut cond, .. } => {
810+
TerminatorKind::Assert { expected, ref msg, ref mut cond, .. } => {
813811
if let Some(value) = self.eval_operand(&cond, source_info) {
814812
trace!("assertion on {:?} should be {:?}", value, expected);
815813
let expected = ScalarMaybeUndef::from(Scalar::from_bool(*expected));
@@ -831,13 +829,13 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> {
831829
.hir()
832830
.as_local_hir_id(self.source.def_id())
833831
.expect("some part of a failing const eval must be local");
834-
use rustc::mir::interpret::InterpError::*;
835832
let msg = match msg {
836-
Panic(PanicMessage::Overflow(_)) |
837-
Panic(PanicMessage::OverflowNeg) |
838-
Panic(PanicMessage::DivisionByZero) |
839-
Panic(PanicMessage::RemainderByZero) => msg.description().to_owned(),
840-
Panic(PanicMessage::BoundsCheck { ref len, ref index }) => {
833+
PanicMessage::Overflow(_) |
834+
PanicMessage::OverflowNeg |
835+
PanicMessage::DivisionByZero |
836+
PanicMessage::RemainderByZero =>
837+
msg.description().to_owned(),
838+
PanicMessage::BoundsCheck { ref len, ref index } => {
841839
let len = self
842840
.eval_operand(len, source_info)
843841
.expect("len must be const");

src/librustc_mir/transform/generator.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1016,7 +1016,7 @@ fn create_generator_resume_function<'tcx>(
10161016

10171017
let mut cases = create_cases(body, &transform, |point| Some(point.resume));
10181018

1019-
use rustc::mir::interpret::InterpError::{
1019+
use rustc::mir::interpret::PanicMessage::{
10201020
GeneratorResumedAfterPanic,
10211021
GeneratorResumedAfterReturn,
10221022
};

0 commit comments

Comments
 (0)