diff options
| author | Jakub Bukaj <jakub@jakub.cc> | 2014-11-20 21:24:39 +0100 |
|---|---|---|
| committer | Jakub Bukaj <jakub@jakub.cc> | 2014-11-20 21:31:59 +0100 |
| commit | 0524161c0be7794a9c508aaa771735da897b555d (patch) | |
| tree | c04dc4dfc89e8c85eca2df72c27cb77b248ff0fe /src/libsyntax/diagnostic.rs | |
| parent | 96c8f2b0c1846756e617f1f1fc1372c506e24248 (diff) | |
| download | rust-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.rs | 56 |
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); |
