let region_scope_span = region_scope.span(self.hir.tcx(),
&self.hir.region_scope_tree);
// Attribute scope exit drops to scope's closing brace.
- // Without this check when finding the endpoint, we'll run into an ICE.
- let scope_end = if region_scope_span.hi().0 == 0 {
- region_scope_span
- } else {
- region_scope_span.end_point()
- };
+ let scope_end = region_scope_span.end_point();
scope.drops.push(DropData {
span: scope_end,
/// Returns a new span representing just the end-point of this span
pub fn end_point(self) -> Span {
let span = self.data();
- let lo = cmp::max(span.hi.0 - 1, span.lo.0);
+ // We can avoid an ICE by checking if subtraction would cause an overflow.
+ let hi = if span.hi.0 == u32::min_value() { span.hi.0 } else { span.hi.0 - 1 };
+ let lo = cmp::max(hi, span.lo.0);
span.with_lo(BytePos(lo))
}