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 @@ fn struct_generic(
|
||||
}
|
||||
// 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)
|
||||
|
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