about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Wood <david@davidtw.co>2018-01-14 00:23:35 +0000
committerDavid Wood <david@davidtw.co>2018-01-27 11:46:26 +0000
commitc6e6428d1a13f61f5ffbe43697a21f3cd82cd01d (patch)
treed5913be5df0ff9cc69b031321423035d246e80c1
parentf6fee2a479070526495b65b6b3e7959088a1dd62 (diff)
downloadrust-c6e6428d1a13f61f5ffbe43697a21f3cd82cd01d.tar.gz
rust-c6e6428d1a13f61f5ffbe43697a21f3cd82cd01d.zip
Moved overflow check into end_point function.
-rw-r--r--src/librustc_mir/build/scope.rs7
-rw-r--r--src/libsyntax_pos/lib.rs4
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))
     }