From c6e6428d1a13f61f5ffbe43697a21f3cd82cd01d Mon Sep 17 00:00:00 2001 From: David Wood Date: Sun, 14 Jan 2018 00:23:35 +0000 Subject: [PATCH] Moved overflow check into end_point function. --- src/librustc_mir/build/scope.rs | 7 +------ src/libsyntax_pos/lib.rs | 4 +++- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/librustc_mir/build/scope.rs b/src/librustc_mir/build/scope.rs index 389e06e9334..50e50b95f77 100644 --- a/src/librustc_mir/build/scope.rs +++ b/src/librustc_mir/build/scope.rs @@ -699,12 +699,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> { 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, diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs index 85f0925b982..5866d8e4aa9 100644 --- a/src/libsyntax_pos/lib.rs +++ b/src/libsyntax_pos/lib.rs @@ -219,7 +219,9 @@ impl Span { /// 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)) }