Skip to content

Commit

Permalink
Deduplicate lines in long const-eval stack trace
Browse files Browse the repository at this point in the history
  • Loading branch information
compiler-errors committed Jan 12, 2022
1 parent cfa4ac6 commit 73ad8df
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 1 deletion.
30 changes: 29 additions & 1 deletion compiler/rustc_const_eval/src/const_eval/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,37 @@ impl<'tcx> ConstEvalErr<'tcx> {
}
// Add spans for the stacktrace. Don't print a single-line backtrace though.
if self.stacktrace.len() > 1 {
// Helper closure to print duplicated lines.
let mut flush_last_line = |last_frame, times| {
if let Some((line, span)) = last_frame {
err.span_label(span, &line);
// Don't print [... additional calls ...] if the number of lines is small
if times < 3 {
for _ in 0..times {
err.span_label(span, &line);
}
} else {
err.span_label(
span,
format!("[... {} additional calls {} ...]", times, &line),
);
}
}
};

let mut last_frame = None;
let mut times = 0;
for frame_info in &self.stacktrace {
err.span_label(frame_info.span, frame_info.to_string());
let frame = (frame_info.to_string(), frame_info.span);
if last_frame.as_ref() == Some(&frame) {
times += 1;
} else {
flush_last_line(last_frame, times);
last_frame = Some(frame);
times = 0;
}
}
flush_last_line(last_frame, times);
}
// Let the caller finish the job.
emit(err)
Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/consts/recursive.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#![allow(unused)]

const fn f<T>(x: T) { //~ WARN function cannot return without recursing
f(x);
//~^ ERROR any use of this value will cause an error
//~| WARN this was previously accepted by the compiler
}

const X: () = f(1);

fn main() {}
31 changes: 31 additions & 0 deletions src/test/ui/consts/recursive.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
warning: function cannot return without recursing
--> $DIR/recursive.rs:3:1
|
LL | const fn f<T>(x: T) {
| ^^^^^^^^^^^^^^^^^^^ cannot return without recursing
LL | f(x);
| ---- recursive call site
|
= note: `#[warn(unconditional_recursion)]` on by default
= help: a `loop` may express intention better if this is on purpose

error: any use of this value will cause an error
--> $DIR/recursive.rs:4:5
|
LL | f(x);
| ^^^^
| |
| reached the configured maximum number of stack frames
| inside `f::<i32>` at $DIR/recursive.rs:4:5
| [... 126 additional calls inside `f::<i32>` at $DIR/recursive.rs:4:5 ...]
| inside `X` at $DIR/recursive.rs:9:15
...
LL | const X: () = f(1);
| -------------------
|
= note: `#[deny(const_err)]` on by default
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>

error: aborting due to previous error; 1 warning emitted

0 comments on commit 73ad8df

Please sign in to comment.