about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorPiotr Czarnecki <pioczarn@gmail.com>2015-02-08 23:26:12 +0100
committerPiotr Czarnecki <pioczarn@gmail.com>2015-02-08 23:26:12 +0100
commit89b2e9f6f34ce00b3d6c24650922de26c8ed1e44 (patch)
tree6ab6d73c67a39bff5e957d33d2ed708926f1b617 /src/libsyntax
parentd4f9ec566249f88845c88c8b897097a262b4e0af (diff)
downloadrust-89b2e9f6f34ce00b3d6c24650922de26c8ed1e44.tar.gz
rust-89b2e9f6f34ce00b3d6c24650922de26c8ed1e44.zip
syntax: Fix integer underflow in diagnostic
Fixes #22091
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/diagnostic.rs11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs
index 454209bdba2..83a4d938bb5 100644
--- a/src/libsyntax/diagnostic.rs
+++ b/src/libsyntax/diagnostic.rs
@@ -518,10 +518,11 @@ fn highlight_lines(err: &mut EmitterWriter,
             let count = match lastc {
                 // Most terminals have a tab stop every eight columns by default
                 '\t' => 8 - col%8,
-                _ => lastc.width(false).unwrap_or(1),
+                _ => lastc.width(false).unwrap_or(0),
             };
             col += count;
-            s.extend(::std::iter::repeat('~').take(count - 1));
+            s.extend(::std::iter::repeat('~').take(count));
+
             let hi = cm.lookup_char_pos(sp.hi);
             if hi.col != lo.col {
                 for (pos, ch) in iter {
@@ -534,6 +535,12 @@ fn highlight_lines(err: &mut EmitterWriter,
                     s.extend(::std::iter::repeat('~').take(count));
                 }
             }
+
+            if s.len() > 1 {
+                // One extra squiggly is replaced by a "^"
+                s.pop();
+            }
+
             try!(print_maybe_styled(err,
                                     &format!("{}\n", s)[],
                                     term::attr::ForegroundColor(lvl.color())));