about summary refs log tree commit diff
path: root/src/libsyntax/diagnostic.rs
diff options
context:
space:
mode:
authorJakub Bukaj <jakub@jakub.cc>2014-11-20 21:24:39 +0100
committerJakub Bukaj <jakub@jakub.cc>2014-11-20 21:31:59 +0100
commit0524161c0be7794a9c508aaa771735da897b555d (patch)
treec04dc4dfc89e8c85eca2df72c27cb77b248ff0fe /src/libsyntax/diagnostic.rs
parent96c8f2b0c1846756e617f1f1fc1372c506e24248 (diff)
downloadrust-0524161c0be7794a9c508aaa771735da897b555d.tar.gz
rust-0524161c0be7794a9c508aaa771735da897b555d.zip
Fix an ICE on diagnostics originating in external macros
Diffstat (limited to 'src/libsyntax/diagnostic.rs')
-rw-r--r--src/libsyntax/diagnostic.rs56
1 files changed, 33 insertions, 23 deletions
diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs
index ff600fcc7c2..293c1b3a953 100644
--- a/src/libsyntax/diagnostic.rs
+++ b/src/libsyntax/diagnostic.rs
@@ -436,9 +436,11 @@ fn highlight_lines(err: &mut EmitterWriter,
         elided = true;
     }
     // Print the offending lines
-    for line in display_lines.iter() {
-        try!(write!(&mut err.dst, "{}:{} {}\n", fm.name, *line + 1,
-                    fm.get_line(*line as int)));
+    for &line_number in display_lines.iter() {
+        if let Some(line) = fm.get_line(line_number) {
+            try!(write!(&mut err.dst, "{}:{} {}\n", fm.name,
+                        line_number + 1, line));
+        }
     }
     if elided {
         let last_line = display_lines[display_lines.len() - 1u];
@@ -465,24 +467,26 @@ fn highlight_lines(err: &mut EmitterWriter,
         for _ in range(0, skip) {
             s.push(' ');
         }
-        let orig = fm.get_line(lines.lines[0] as int);
-        for pos in range(0u, left-skip) {
-            let cur_char = orig.as_bytes()[pos] as char;
-            // Whenever a tab occurs on the previous line, we insert one on
-            // the error-point-squiggly-line as well (instead of a space).
-            // That way the squiggly line will usually appear in the correct
-            // position.
-            match cur_char {
-                '\t' => s.push('\t'),
-                _ => s.push(' '),
-            };
+        if let Some(orig) = fm.get_line(lines.lines[0]) {
+            for pos in range(0u, left - skip) {
+                let cur_char = orig.as_bytes()[pos] as char;
+                // Whenever a tab occurs on the previous line, we insert one on
+                // the error-point-squiggly-line as well (instead of a space).
+                // That way the squiggly line will usually appear in the correct
+                // position.
+                match cur_char {
+                    '\t' => s.push('\t'),
+                    _ => s.push(' '),
+                };
+            }
         }
+
         try!(write!(&mut err.dst, "{}", s));
         let mut s = String::from_str("^");
         let hi = cm.lookup_char_pos(sp.hi);
         if hi.col != lo.col {
             // the ^ already takes up one space
-            let num_squigglies = hi.col.to_uint()-lo.col.to_uint()-1u;
+            let num_squigglies = hi.col.to_uint() - lo.col.to_uint() - 1u;
             for _ in range(0, num_squigglies) {
                 s.push('~');
             }
@@ -510,16 +514,22 @@ fn custom_highlight_lines(w: &mut EmitterWriter,
 
     let lines = lines.lines.as_slice();
     if lines.len() > MAX_LINES {
-        try!(write!(&mut w.dst, "{}:{} {}\n", fm.name,
-                    lines[0] + 1, fm.get_line(lines[0] as int)));
+        if let Some(line) = fm.get_line(lines[0]) {
+            try!(write!(&mut w.dst, "{}:{} {}\n", fm.name,
+                        lines[0] + 1, line));
+        }
         try!(write!(&mut w.dst, "...\n"));
-        let last_line = lines[lines.len()-1];
-        try!(write!(&mut w.dst, "{}:{} {}\n", fm.name,
-                    last_line + 1, fm.get_line(last_line as int)));
-    } else {
-        for line in lines.iter() {
+        let last_line_number = lines[lines.len() - 1];
+        if let Some(last_line) = fm.get_line(last_line_number) {
             try!(write!(&mut w.dst, "{}:{} {}\n", fm.name,
-                        *line + 1, fm.get_line(*line as int)));
+                        last_line_number + 1, last_line));
+        }
+    } else {
+        for &line_number in lines.iter() {
+            if let Some(line) = fm.get_line(line_number) {
+                try!(write!(&mut w.dst, "{}:{} {}\n", fm.name,
+                            line_number + 1, line));
+            }
         }
     }
     let last_line_start = format!("{}:{} ", fm.name, lines[lines.len()-1]+1);