mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-09 13:33:43 +00:00
Rollup merge of #92802 - compiler-errors:deduplicate-stack-trace, r=oli-obk
Deduplicate lines in long const-eval stack trace Lemme know if this is kinda overkill, lol. Fixes #92796
This commit is contained in:
commit
2fe9f763d0
@ -156,9 +156,37 @@ impl<'tcx> ConstEvalErr<'tcx> {
|
|||||||
}
|
}
|
||||||
// Add spans for the stacktrace. Don't print a single-line backtrace though.
|
// Add spans for the stacktrace. Don't print a single-line backtrace though.
|
||||||
if self.stacktrace.len() > 1 {
|
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 {
|
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.
|
// Let the caller finish the job.
|
||||||
emit(err)
|
emit(err)
|
||||||
|
11
src/test/ui/consts/recursive.rs
Normal file
11
src/test/ui/consts/recursive.rs
Normal file
@ -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
src/test/ui/consts/recursive.stderr
Normal file
31
src/test/ui/consts/recursive.stderr
Normal file
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user