From 90db98d07484565ab501a35b3077831487447cab Mon Sep 17 00:00:00 2001
From: yukang <moorekang@gmail.com>
Date: Mon, 22 May 2023 02:27:01 +0800
Subject: [PATCH 1/2] print omitted frames count for short backtrace mode

---
 library/std/src/sys_common/backtrace.rs       | 19 +++++++++++++++++++
 src/tools/build-manifest/Cargo.toml           |  2 +-
 .../late-bound-vars/in_closure.rs             |  1 +
 .../const-generics/late-bound-vars/simple.rs  |  1 +
 .../const-eval/const-eval-query-stack.rs      |  2 +-
 .../issue-90014-tait2.rs                      |  2 ++
 .../issue-90014-tait2.stderr                  |  4 ++--
 ...hort-ice-remove-middle-frames-2.run.stderr |  2 ++
 .../short-ice-remove-middle-frames.run.stderr |  1 +
 9 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/library/std/src/sys_common/backtrace.rs b/library/std/src/sys_common/backtrace.rs
index 6f020940df12f..84e2c5d8d7f70 100644
--- a/library/std/src/sys_common/backtrace.rs
+++ b/library/std/src/sys_common/backtrace.rs
@@ -60,6 +60,8 @@ unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::
     bt_fmt.add_context()?;
     let mut idx = 0;
     let mut res = Ok(());
+    let mut omitted_count: usize = 0;
+    let mut first_omit = true;
     // Start immediately if we're not using a short backtrace.
     let mut start = print_fmt != PrintFmt::Short;
     backtrace_rs::trace_unsynchronized(|frame| {
@@ -85,10 +87,27 @@ unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::
                         start = true;
                         return;
                     }
+                    if !start {
+                        omitted_count += 1;
+                    }
                 }
             }
 
             if start {
+                if omitted_count > 0 {
+                    debug_assert!(print_fmt == PrintFmt::Short);
+                    // only print the message between the middle of frames
+                    if !first_omit {
+                        let _ = writeln!(
+                            bt_fmt.formatter(),
+                            "      [... omitted {} frame{} ...]",
+                            omitted_count,
+                            if omitted_count > 1 { "s" } else { "" }
+                        );
+                    }
+                    first_omit = false;
+                    omitted_count = 0;
+                }
                 res = bt_fmt.frame().symbol(frame, symbol);
             }
         });
diff --git a/src/tools/build-manifest/Cargo.toml b/src/tools/build-manifest/Cargo.toml
index 6c3b5bb00a347..7e0c4bee2b3cc 100644
--- a/src/tools/build-manifest/Cargo.toml
+++ b/src/tools/build-manifest/Cargo.toml
@@ -8,7 +8,7 @@ toml = "0.5"
 serde = { version = "1.0", features = ["derive"] }
 serde_json = "1.0"
 anyhow = "1.0.32"
-flate2 = "1.0.16"
+flate2 = "1.0.26"
 xz2 = "0.1.7"
 tar = "0.4.29"
 sha2 = "0.10.1"
diff --git a/tests/ui/const-generics/late-bound-vars/in_closure.rs b/tests/ui/const-generics/late-bound-vars/in_closure.rs
index 00fb535f04879..43dedc561ef6e 100644
--- a/tests/ui/const-generics/late-bound-vars/in_closure.rs
+++ b/tests/ui/const-generics/late-bound-vars/in_closure.rs
@@ -16,6 +16,7 @@
 // normalize-stderr-test "\n\n[ ]*\n" -> ""
 // normalize-stderr-test "compiler/.*: projection" -> "projection"
 // this should run-pass
+// normalize-stderr-test ".*omitted \d{1,} frame.*\n" -> ""
 
 #![feature(generic_const_exprs)]
 #![allow(incomplete_features)]
diff --git a/tests/ui/const-generics/late-bound-vars/simple.rs b/tests/ui/const-generics/late-bound-vars/simple.rs
index 5d19aaf0b9555..30fc36209fedc 100644
--- a/tests/ui/const-generics/late-bound-vars/simple.rs
+++ b/tests/ui/const-generics/late-bound-vars/simple.rs
@@ -15,6 +15,7 @@
 // normalize-stderr-test ".*note: Some details.*\n" -> ""
 // normalize-stderr-test "\n\n[ ]*\n" -> ""
 // normalize-stderr-test "compiler/.*: projection" -> "projection"
+// normalize-stderr-test ".*omitted \d{1,} frame.*\n" -> ""
 
 #![feature(generic_const_exprs)]
 #![allow(incomplete_features)]
diff --git a/tests/ui/consts/const-eval/const-eval-query-stack.rs b/tests/ui/consts/const-eval/const-eval-query-stack.rs
index 81f28c1755deb..33753dc74455c 100644
--- a/tests/ui/consts/const-eval/const-eval-query-stack.rs
+++ b/tests/ui/consts/const-eval/const-eval-query-stack.rs
@@ -10,7 +10,7 @@
 // normalize-stderr-test "\s\d{1,}: .*\n" -> ""
 // normalize-stderr-test "\s at .*\n" -> ""
 // normalize-stderr-test ".*note: Some details.*\n" -> ""
-
+// normalize-stderr-test ".*omitted \d{1,} frame.*\n" -> ""
 #![allow(unconditional_panic)]
 
 const X: i32 = 1 / 0; //~ERROR constant
diff --git a/tests/ui/generic-associated-types/issue-90014-tait2.rs b/tests/ui/generic-associated-types/issue-90014-tait2.rs
index dacbc93dec880..f541285fd1b9d 100644
--- a/tests/ui/generic-associated-types/issue-90014-tait2.rs
+++ b/tests/ui/generic-associated-types/issue-90014-tait2.rs
@@ -18,6 +18,8 @@
 // normalize-stderr-test ".*note: Some details.*\n" -> ""
 // normalize-stderr-test "\n\n[ ]*\n" -> ""
 // normalize-stderr-test "compiler/.*: projection" -> "projection"
+// normalize-stderr-test ".*omitted \d{1,} frame.*\n" -> ""
+
 // edition:2018
 
 #![feature(type_alias_impl_trait)]
diff --git a/tests/ui/generic-associated-types/issue-90014-tait2.stderr b/tests/ui/generic-associated-types/issue-90014-tait2.stderr
index 3187be3334c5f..652270050363b 100644
--- a/tests/ui/generic-associated-types/issue-90014-tait2.stderr
+++ b/tests/ui/generic-associated-types/issue-90014-tait2.stderr
@@ -1,9 +1,9 @@
 error: 
-  --> $DIR/issue-90014-tait2.rs:41:27
+  --> $DIR/issue-90014-tait2.rs:43:27
    |
 LL |     fn make_fut(&self) -> Box<dyn for<'a> Trait<'a, Thing = Fut<'a>>> {
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^query stack during panic:
-#0 [typeck] type-checking `<impl at $DIR/issue-90014-tait2.rs:40:1: 40:13>::make_fut`
+#0 [typeck] type-checking `<impl at $DIR/issue-90014-tait2.rs:42:1: 42:13>::make_fut`
 #1 [type_of] computing type of `Fut::{opaque#0}`
 #2 [check_mod_item_types] checking item types in top-level module
 #3 [analysis] running analysis passes on this crate
diff --git a/tests/ui/panics/short-ice-remove-middle-frames-2.run.stderr b/tests/ui/panics/short-ice-remove-middle-frames-2.run.stderr
index 2592b7479186a..7263c03bab3ee 100644
--- a/tests/ui/panics/short-ice-remove-middle-frames-2.run.stderr
+++ b/tests/ui/panics/short-ice-remove-middle-frames-2.run.stderr
@@ -3,8 +3,10 @@ stack backtrace:
    0: std::panicking::begin_panic
    1: short_ice_remove_middle_frames_2::eight
    2: short_ice_remove_middle_frames_2::seven::{{closure}}
+      [... omitted 3 frames ...]
    3: short_ice_remove_middle_frames_2::fifth
    4: short_ice_remove_middle_frames_2::fourth::{{closure}}
+      [... omitted 4 frames ...]
    5: short_ice_remove_middle_frames_2::first
    6: short_ice_remove_middle_frames_2::main
    7: core::ops::function::FnOnce::call_once
diff --git a/tests/ui/panics/short-ice-remove-middle-frames.run.stderr b/tests/ui/panics/short-ice-remove-middle-frames.run.stderr
index 9c15f2e08feed..a221668066064 100644
--- a/tests/ui/panics/short-ice-remove-middle-frames.run.stderr
+++ b/tests/ui/panics/short-ice-remove-middle-frames.run.stderr
@@ -4,6 +4,7 @@ stack backtrace:
    1: short_ice_remove_middle_frames::seven
    2: short_ice_remove_middle_frames::sixth
    3: short_ice_remove_middle_frames::fifth::{{closure}}
+      [... omitted 4 frames ...]
    4: short_ice_remove_middle_frames::second
    5: short_ice_remove_middle_frames::first::{{closure}}
    6: short_ice_remove_middle_frames::first

From 7b3d1b775fbfc0bc297eaefa707e50c2d256ce5e Mon Sep 17 00:00:00 2001
From: yukang <moorekang@gmail.com>
Date: Sun, 30 Jul 2023 15:49:57 +0800
Subject: [PATCH 2/2] normalize backtrace error messages

---
 tests/ui/const-generics/late-bound-vars/in_closure.rs      | 5 +++--
 tests/ui/const-generics/late-bound-vars/in_closure.stderr  | 4 +---
 tests/ui/const-generics/late-bound-vars/simple.rs          | 1 +
 tests/ui/generic-associated-types/issue-90014-tait2.rs     | 3 ++-
 tests/ui/generic-associated-types/issue-90014-tait2.stderr | 4 ++--
 5 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/tests/ui/const-generics/late-bound-vars/in_closure.rs b/tests/ui/const-generics/late-bound-vars/in_closure.rs
index 43dedc561ef6e..235d147c7ecba 100644
--- a/tests/ui/const-generics/late-bound-vars/in_closure.rs
+++ b/tests/ui/const-generics/late-bound-vars/in_closure.rs
@@ -13,10 +13,11 @@
 // normalize-stderr-test "\s\d{1,}: .*\n" -> ""
 // normalize-stderr-test "\s at .*\n" -> ""
 // normalize-stderr-test ".*note: Some details.*\n" -> ""
-// normalize-stderr-test "\n\n[ ]*\n" -> ""
+// normalize-stderr-test "\n[ ]*\n" -> ""
 // normalize-stderr-test "compiler/.*: projection" -> "projection"
-// this should run-pass
 // normalize-stderr-test ".*omitted \d{1,} frame.*\n" -> ""
+// normalize-stderr-test "error: [\s\n]*query stack during panic:\n" -> ""
+// this should run-pass
 
 #![feature(generic_const_exprs)]
 #![allow(incomplete_features)]
diff --git a/tests/ui/const-generics/late-bound-vars/in_closure.stderr b/tests/ui/const-generics/late-bound-vars/in_closure.stderr
index 9dc5ea1f16a5e..ac406bf2bb13e 100644
--- a/tests/ui/const-generics/late-bound-vars/in_closure.stderr
+++ b/tests/ui/const-generics/late-bound-vars/in_closure.stderr
@@ -1,4 +1,3 @@
-error: query stack during panic:
 #0 [mir_borrowck] borrow-checking `test::{closure#0}::{constant#1}`
 #1 [mir_drops_elaborated_and_const_checked] elaborating drops for `test::{closure#0}::{constant#1}`
 #2 [mir_for_ctfe] caching mir of `test::{closure#0}::{constant#1}` for CTFE
@@ -8,5 +7,4 @@ error: query stack during panic:
 #6 [typeck] type-checking `test`
 #7 [analysis] running analysis passes on this crate
 end of query stack
-error: aborting due to previous error
-
+error: aborting due to previous error
\ No newline at end of file
diff --git a/tests/ui/const-generics/late-bound-vars/simple.rs b/tests/ui/const-generics/late-bound-vars/simple.rs
index 30fc36209fedc..411a974cef9b6 100644
--- a/tests/ui/const-generics/late-bound-vars/simple.rs
+++ b/tests/ui/const-generics/late-bound-vars/simple.rs
@@ -16,6 +16,7 @@
 // normalize-stderr-test "\n\n[ ]*\n" -> ""
 // normalize-stderr-test "compiler/.*: projection" -> "projection"
 // normalize-stderr-test ".*omitted \d{1,} frame.*\n" -> ""
+// normalize-stderr-test "error: [\s\n]*query stack" -> "error: query stack"
 
 #![feature(generic_const_exprs)]
 #![allow(incomplete_features)]
diff --git a/tests/ui/generic-associated-types/issue-90014-tait2.rs b/tests/ui/generic-associated-types/issue-90014-tait2.rs
index f541285fd1b9d..8da3baeb17a3f 100644
--- a/tests/ui/generic-associated-types/issue-90014-tait2.rs
+++ b/tests/ui/generic-associated-types/issue-90014-tait2.rs
@@ -19,7 +19,8 @@
 // normalize-stderr-test "\n\n[ ]*\n" -> ""
 // normalize-stderr-test "compiler/.*: projection" -> "projection"
 // normalize-stderr-test ".*omitted \d{1,} frame.*\n" -> ""
-
+// normalize-stderr-test "error: [\s\n]*query stack" -> "error: query stack"
+// normalize-stderr-test "[\n\s]*\nquery stack during panic:" -> "query stack during panic:"
 // edition:2018
 
 #![feature(type_alias_impl_trait)]
diff --git a/tests/ui/generic-associated-types/issue-90014-tait2.stderr b/tests/ui/generic-associated-types/issue-90014-tait2.stderr
index 652270050363b..2538eb46dfa73 100644
--- a/tests/ui/generic-associated-types/issue-90014-tait2.stderr
+++ b/tests/ui/generic-associated-types/issue-90014-tait2.stderr
@@ -1,9 +1,9 @@
 error: 
-  --> $DIR/issue-90014-tait2.rs:43:27
+  --> $DIR/issue-90014-tait2.rs:44:27
    |
 LL |     fn make_fut(&self) -> Box<dyn for<'a> Trait<'a, Thing = Fut<'a>>> {
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^query stack during panic:
-#0 [typeck] type-checking `<impl at $DIR/issue-90014-tait2.rs:42:1: 42:13>::make_fut`
+#0 [typeck] type-checking `<impl at $DIR/issue-90014-tait2.rs:43:1: 43:13>::make_fut`
 #1 [type_of] computing type of `Fut::{opaque#0}`
 #2 [check_mod_item_types] checking item types in top-level module
 #3 [analysis] running analysis passes on this crate