Skip to content

Commit

Permalink
Rollup merge of rust-lang#47677 - etaoins:avoid-underflow-in-rennder-…
Browse files Browse the repository at this point in the history
…source-line, r=estebank

Avoid underflow in render_source_line

While testing rust-lang#47655 I was able to make the compiler panic when it's compiled with debug assertions:

```shell
> rustc /dev/null --crate-type proc-macro

error: internal compiler error: unexpected panic

note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports

note: rustc 1.25.0-dev running on x86_64-apple-darwin

note: run with `RUST_BACKTRACE=1` for a backtrace

thread 'rustc' panicked at 'attempt to subtract with overflow', librustc_errors/emitter.rs:287:49
```

Without debug assertions the following warning is emitted:

```shell
> rustc /dev/null --crate-type proc-macro

warning: unused variable: `registrar`
 --> /dev/null:0:1
  |
  |
  = note: #[warn(unused_variables)] on by default
  = note: to avoid this warning, consider using `_registrar` instead
```

The panic is due to the unused variable warning being spanned to `/dev/null:0:1`. When `render_source_line` subtracts 1 from the line number to look up the source line it panics due to underflow. Without debug assertions this would wrap and cause us to return a blank string instead.

Fix by explicitly testing for 0 and exiting early. I'm unsure how to automatically test this now that rust-lang#46655 has been approved.
  • Loading branch information
kennytm committed Jan 31, 2018
2 parents 64fc9d2 + c6377f8 commit 68135d1
Showing 1 changed file with 4 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/librustc_errors/emitter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,10 @@ impl EmitterWriter {
line: &Line,
width_offset: usize,
code_offset: usize) -> Vec<(usize, Style)> {
if line.line_index == 0 {
return Vec::new();
}

let source_string = match file.get_line(line.line_index - 1) {
Some(s) => s,
None => return Vec::new(),
Expand Down

0 comments on commit 68135d1

Please sign in to comment.