std: avoid tearing dbg! prints - #149869

Merged
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg
Jan 25, 2026
Merged

std: avoid tearing dbg! prints#149869
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg

Conversation

@joboet

@joboetjoboet commented Dec 10, 2025

Copy link
Copy Markdown
Member

Fixes#136703.

This is an alternative to #149859. Instead of formatting everything into a string, this PR makes multi-expression dbg! expand into multiple nested matches, with the final match containing a single eprint!. By using macro recursion and relying on hygiene, this allows naming every bound value in that eprint!.

CC @orlp

r? libs

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 10, 2025
@joboetjoboet mentioned this pull request Dec 10, 2025
@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

Neat solution :) I wasn't sure if we could use helper macros.

Comment threadlibrary/std/src/macros.rs Outdated
@rustbotrustbot added the T-clippy Relevant to the Clippy team. label Dec 12, 2025
@joboet
joboet marked this pull request as ready for review December 12, 2025 12:25
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 12, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Dec 12, 2025
loop {
let [arm] = arms else { unreachable!("dbg! macro expansion only has single-arm matches") };

match is_async_move_desugar(arm.body).unwrap_or(arm.body).peel_drop_temps().kind {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this is really necessary, I just copied this from above.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is needed here. You can probably use match arm.body.kind { and add this extra test line to src/tools/clippy/tests/ui/dbg_macro/dbg_macro.rs (and bless the results with ./x test clippy --bless):

takes_async_fn(asyncmove |val| {dbg!(val, val + 1); val });//~^ dbg_macro

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

Is it allowed to change those error messages to leak those internal details?

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

@joboet

Copy link
Copy Markdown
MemberAuthor

Is it allowed to change those error messages to leak those internal details?

I don't think there's currently a way to tell the compiler to hide them unfortunately. But yes, this is fine, or at least there is precedent – the same happens for thread_local!: If you try

thread_local!{
#[rustc_align_static(42)]staticLOCAL:i32 = 42;}

(playground) on stable, the error message will reference $crate::thread::local_impl::thread_local_inner.

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details. I'm sure there is a way to abuse #[allow_internal_unstable] to make some macro arms unusable from stable, but I don't think its worth the hassle.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

@joboet

Copy link
Copy Markdown
MemberAuthor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

No, since the macro is perma-unstable 😏

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

@joboet

joboet commented Dec 13, 2025

Copy link
Copy Markdown
MemberAuthor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

dbg! is marked with #[allow_internal_unstable(std_internals)] which allows dbg_internal! to be used from code generated by the macro (but not in spans passed to the macro) despite it being an unstable feature. We use the same trick for thread_local!, since it too needs to invoke unstable helper macros, which need to use unstable features like #[thread_local] themselves.

Edit: So yes, essentially just stdlib magic sprinkles 😄

@bors

bors commented Dec 17, 2025

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #150068) made this pull request unmergeable. Please resolve the merge conflicts.

Comment threadlibrary/std/src/macros.rs
github-actionsBot pushed a commit to rust-lang/miri that referenced this pull request Jan 26, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request Jan 27, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust that referenced this pull request Feb 12, 2026
std: avoid tearing `dbg!` prints
Fixesrust-lang#136703.
This is an alternative to rust-lang#149859. Instead of formatting everything into a string, this PR makes multi-expression `dbg!` expand into multiple nested matches, with the final match containing a single `eprint!`. By using macro recursion and relying on hygiene, this allows naming every bound value in that `eprint!`.
CC @orlp
r? libs
cuviper added a commit to cuviper/rust that referenced this pull request Apr 8, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
@cuvipercuviper mentioned this pull request Apr 8, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
[^1]: #153850
[^2]: #154988
[^3]: #154406
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
Clippy is backporting 2 ICE fixes and 1 perf regression (via #155051):
- rust-lang/rust-clippy#16685 already backported in #154211 to stable. This makes sure that it doesn't regress again in beta/next stable
- rust-lang/rust-clippy#16659 The ICE that is being fixed here was introduced in the 1.95 release cycle
- rust-lang/rust-clippy#16652 Perf regression introduced in the 1.95 release cycle.
[^1]: #153850
[^2]: #154988
[^3]: #154406
@theemathas

Copy link
Copy Markdown
Contributor

Should there be release notes for this in 1.96.0?

rust-borsBot pushed a commit that referenced this pull request May 19, 2026
rust-borsBot pushed a commit that referenced this pull request May 19, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in #149869, we've been chasing a few regressions:
* #153850, fixed by #154074
* #154988, fixed by #154994
* #155902, proposed fix in #155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
cuviper added a commit to cuviper/rust that referenced this pull request May 20, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
(cherry picked from commit 9246e19)
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request May 20, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request May 28, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust that referenced this pull request May 28, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request May 30, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
pullBot pushed a commit to asukaminato0721/rust-analyzer that referenced this pull request Jun 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jun 8, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-clippyRelevant to the Clippy team.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dbg! prints can tear in multi-threading code

9 participants

@joboet@rust-log-analyzer@orlp@rustbot@bors@Mark-Simulacrum@theemathas@samueltardieu@Jamesbarford
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

std: avoid tearing dbg! prints - #149869

Merged
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg
Jan 25, 2026
Merged

std: avoid tearing dbg! prints#149869
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg

Conversation

@joboet

@joboetjoboet commented Dec 10, 2025

Copy link
Copy Markdown
Member

Fixes#136703.

This is an alternative to #149859. Instead of formatting everything into a string, this PR makes multi-expression dbg! expand into multiple nested matches, with the final match containing a single eprint!. By using macro recursion and relying on hygiene, this allows naming every bound value in that eprint!.

CC @orlp

r? libs

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 10, 2025
@joboetjoboet mentioned this pull request Dec 10, 2025
@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

Neat solution :) I wasn't sure if we could use helper macros.

Comment threadlibrary/std/src/macros.rs Outdated
@rustbotrustbot added the T-clippy Relevant to the Clippy team. label Dec 12, 2025
@joboet
joboet marked this pull request as ready for review December 12, 2025 12:25
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 12, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Dec 12, 2025
loop {
let [arm] = arms else { unreachable!("dbg! macro expansion only has single-arm matches") };

match is_async_move_desugar(arm.body).unwrap_or(arm.body).peel_drop_temps().kind {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this is really necessary, I just copied this from above.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is needed here. You can probably use match arm.body.kind { and add this extra test line to src/tools/clippy/tests/ui/dbg_macro/dbg_macro.rs (and bless the results with ./x test clippy --bless):

takes_async_fn(asyncmove |val| {dbg!(val, val + 1); val });//~^ dbg_macro

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

Is it allowed to change those error messages to leak those internal details?

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

@joboet

Copy link
Copy Markdown
MemberAuthor

Is it allowed to change those error messages to leak those internal details?

I don't think there's currently a way to tell the compiler to hide them unfortunately. But yes, this is fine, or at least there is precedent – the same happens for thread_local!: If you try

thread_local!{
#[rustc_align_static(42)]staticLOCAL:i32 = 42;}

(playground) on stable, the error message will reference $crate::thread::local_impl::thread_local_inner.

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details. I'm sure there is a way to abuse #[allow_internal_unstable] to make some macro arms unusable from stable, but I don't think its worth the hassle.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

@joboet

Copy link
Copy Markdown
MemberAuthor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

No, since the macro is perma-unstable 😏

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

@joboet

joboet commented Dec 13, 2025

Copy link
Copy Markdown
MemberAuthor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

dbg! is marked with #[allow_internal_unstable(std_internals)] which allows dbg_internal! to be used from code generated by the macro (but not in spans passed to the macro) despite it being an unstable feature. We use the same trick for thread_local!, since it too needs to invoke unstable helper macros, which need to use unstable features like #[thread_local] themselves.

Edit: So yes, essentially just stdlib magic sprinkles 😄

@bors

bors commented Dec 17, 2025

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #150068) made this pull request unmergeable. Please resolve the merge conflicts.

Comment threadlibrary/std/src/macros.rs
github-actionsBot pushed a commit to rust-lang/miri that referenced this pull request Jan 26, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request Jan 27, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust that referenced this pull request Feb 12, 2026
std: avoid tearing `dbg!` prints
Fixesrust-lang#136703.
This is an alternative to rust-lang#149859. Instead of formatting everything into a string, this PR makes multi-expression `dbg!` expand into multiple nested matches, with the final match containing a single `eprint!`. By using macro recursion and relying on hygiene, this allows naming every bound value in that `eprint!`.
CC @orlp
r? libs
cuviper added a commit to cuviper/rust that referenced this pull request Apr 8, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
@cuvipercuviper mentioned this pull request Apr 8, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
[^1]: #153850
[^2]: #154988
[^3]: #154406
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
Clippy is backporting 2 ICE fixes and 1 perf regression (via #155051):
- rust-lang/rust-clippy#16685 already backported in #154211 to stable. This makes sure that it doesn't regress again in beta/next stable
- rust-lang/rust-clippy#16659 The ICE that is being fixed here was introduced in the 1.95 release cycle
- rust-lang/rust-clippy#16652 Perf regression introduced in the 1.95 release cycle.
[^1]: #153850
[^2]: #154988
[^3]: #154406
@theemathas

Copy link
Copy Markdown
Contributor

Should there be release notes for this in 1.96.0?

rust-borsBot pushed a commit that referenced this pull request May 19, 2026
rust-borsBot pushed a commit that referenced this pull request May 19, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in #149869, we've been chasing a few regressions:
* #153850, fixed by #154074
* #154988, fixed by #154994
* #155902, proposed fix in #155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
cuviper added a commit to cuviper/rust that referenced this pull request May 20, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
(cherry picked from commit 9246e19)
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request May 20, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request May 28, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust that referenced this pull request May 28, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request May 30, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
pullBot pushed a commit to asukaminato0721/rust-analyzer that referenced this pull request Jun 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jun 8, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-clippyRelevant to the Clippy team.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dbg! prints can tear in multi-threading code

9 participants

@joboet@rust-log-analyzer@orlp@rustbot@bors@Mark-Simulacrum@theemathas@samueltardieu@Jamesbarford
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

std: avoid tearing dbg! prints - #149869

Merged
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg
Jan 25, 2026
Merged

std: avoid tearing dbg! prints#149869
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg

Conversation

@joboet

@joboetjoboet commented Dec 10, 2025

Copy link
Copy Markdown
Member

Fixes#136703.

This is an alternative to #149859. Instead of formatting everything into a string, this PR makes multi-expression dbg! expand into multiple nested matches, with the final match containing a single eprint!. By using macro recursion and relying on hygiene, this allows naming every bound value in that eprint!.

CC @orlp

r? libs

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 10, 2025
@joboetjoboet mentioned this pull request Dec 10, 2025
@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

Neat solution :) I wasn't sure if we could use helper macros.

Comment threadlibrary/std/src/macros.rs Outdated
@rustbotrustbot added the T-clippy Relevant to the Clippy team. label Dec 12, 2025
@joboet
joboet marked this pull request as ready for review December 12, 2025 12:25
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 12, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Dec 12, 2025
loop {
let [arm] = arms else { unreachable!("dbg! macro expansion only has single-arm matches") };

match is_async_move_desugar(arm.body).unwrap_or(arm.body).peel_drop_temps().kind {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this is really necessary, I just copied this from above.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is needed here. You can probably use match arm.body.kind { and add this extra test line to src/tools/clippy/tests/ui/dbg_macro/dbg_macro.rs (and bless the results with ./x test clippy --bless):

takes_async_fn(asyncmove |val| {dbg!(val, val + 1); val });//~^ dbg_macro

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

Is it allowed to change those error messages to leak those internal details?

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

@joboet

Copy link
Copy Markdown
MemberAuthor

Is it allowed to change those error messages to leak those internal details?

I don't think there's currently a way to tell the compiler to hide them unfortunately. But yes, this is fine, or at least there is precedent – the same happens for thread_local!: If you try

thread_local!{
#[rustc_align_static(42)]staticLOCAL:i32 = 42;}

(playground) on stable, the error message will reference $crate::thread::local_impl::thread_local_inner.

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details. I'm sure there is a way to abuse #[allow_internal_unstable] to make some macro arms unusable from stable, but I don't think its worth the hassle.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

@joboet

Copy link
Copy Markdown
MemberAuthor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

No, since the macro is perma-unstable 😏

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

@joboet

joboet commented Dec 13, 2025

Copy link
Copy Markdown
MemberAuthor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

dbg! is marked with #[allow_internal_unstable(std_internals)] which allows dbg_internal! to be used from code generated by the macro (but not in spans passed to the macro) despite it being an unstable feature. We use the same trick for thread_local!, since it too needs to invoke unstable helper macros, which need to use unstable features like #[thread_local] themselves.

Edit: So yes, essentially just stdlib magic sprinkles 😄

@bors

bors commented Dec 17, 2025

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #150068) made this pull request unmergeable. Please resolve the merge conflicts.

Comment threadlibrary/std/src/macros.rs
github-actionsBot pushed a commit to rust-lang/miri that referenced this pull request Jan 26, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request Jan 27, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust that referenced this pull request Feb 12, 2026
std: avoid tearing `dbg!` prints
Fixesrust-lang#136703.
This is an alternative to rust-lang#149859. Instead of formatting everything into a string, this PR makes multi-expression `dbg!` expand into multiple nested matches, with the final match containing a single `eprint!`. By using macro recursion and relying on hygiene, this allows naming every bound value in that `eprint!`.
CC @orlp
r? libs
cuviper added a commit to cuviper/rust that referenced this pull request Apr 8, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
@cuvipercuviper mentioned this pull request Apr 8, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
[^1]: #153850
[^2]: #154988
[^3]: #154406
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
Clippy is backporting 2 ICE fixes and 1 perf regression (via #155051):
- rust-lang/rust-clippy#16685 already backported in #154211 to stable. This makes sure that it doesn't regress again in beta/next stable
- rust-lang/rust-clippy#16659 The ICE that is being fixed here was introduced in the 1.95 release cycle
- rust-lang/rust-clippy#16652 Perf regression introduced in the 1.95 release cycle.
[^1]: #153850
[^2]: #154988
[^3]: #154406
@theemathas

Copy link
Copy Markdown
Contributor

Should there be release notes for this in 1.96.0?

rust-borsBot pushed a commit that referenced this pull request May 19, 2026
rust-borsBot pushed a commit that referenced this pull request May 19, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in #149869, we've been chasing a few regressions:
* #153850, fixed by #154074
* #154988, fixed by #154994
* #155902, proposed fix in #155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
cuviper added a commit to cuviper/rust that referenced this pull request May 20, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
(cherry picked from commit 9246e19)
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request May 20, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request May 28, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust that referenced this pull request May 28, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request May 30, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
pullBot pushed a commit to asukaminato0721/rust-analyzer that referenced this pull request Jun 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jun 8, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-clippyRelevant to the Clippy team.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dbg! prints can tear in multi-threading code

9 participants

@joboet@rust-log-analyzer@orlp@rustbot@bors@Mark-Simulacrum@theemathas@samueltardieu@Jamesbarford
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

std: avoid tearing dbg! prints - #149869

Merged
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg
Jan 25, 2026
Merged

std: avoid tearing dbg! prints#149869
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg

Conversation

@joboet

@joboetjoboet commented Dec 10, 2025

Copy link
Copy Markdown
Member

Fixes#136703.

This is an alternative to #149859. Instead of formatting everything into a string, this PR makes multi-expression dbg! expand into multiple nested matches, with the final match containing a single eprint!. By using macro recursion and relying on hygiene, this allows naming every bound value in that eprint!.

CC @orlp

r? libs

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 10, 2025
@joboetjoboet mentioned this pull request Dec 10, 2025
@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

Neat solution :) I wasn't sure if we could use helper macros.

Comment threadlibrary/std/src/macros.rs Outdated
@rustbotrustbot added the T-clippy Relevant to the Clippy team. label Dec 12, 2025
@joboet
joboet marked this pull request as ready for review December 12, 2025 12:25
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 12, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Dec 12, 2025
loop {
let [arm] = arms else { unreachable!("dbg! macro expansion only has single-arm matches") };

match is_async_move_desugar(arm.body).unwrap_or(arm.body).peel_drop_temps().kind {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this is really necessary, I just copied this from above.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is needed here. You can probably use match arm.body.kind { and add this extra test line to src/tools/clippy/tests/ui/dbg_macro/dbg_macro.rs (and bless the results with ./x test clippy --bless):

takes_async_fn(asyncmove |val| {dbg!(val, val + 1); val });//~^ dbg_macro

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

Is it allowed to change those error messages to leak those internal details?

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

@joboet

Copy link
Copy Markdown
MemberAuthor

Is it allowed to change those error messages to leak those internal details?

I don't think there's currently a way to tell the compiler to hide them unfortunately. But yes, this is fine, or at least there is precedent – the same happens for thread_local!: If you try

thread_local!{
#[rustc_align_static(42)]staticLOCAL:i32 = 42;}

(playground) on stable, the error message will reference $crate::thread::local_impl::thread_local_inner.

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details. I'm sure there is a way to abuse #[allow_internal_unstable] to make some macro arms unusable from stable, but I don't think its worth the hassle.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

@joboet

Copy link
Copy Markdown
MemberAuthor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

No, since the macro is perma-unstable 😏

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

@joboet

joboet commented Dec 13, 2025

Copy link
Copy Markdown
MemberAuthor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

dbg! is marked with #[allow_internal_unstable(std_internals)] which allows dbg_internal! to be used from code generated by the macro (but not in spans passed to the macro) despite it being an unstable feature. We use the same trick for thread_local!, since it too needs to invoke unstable helper macros, which need to use unstable features like #[thread_local] themselves.

Edit: So yes, essentially just stdlib magic sprinkles 😄

@bors

bors commented Dec 17, 2025

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #150068) made this pull request unmergeable. Please resolve the merge conflicts.

Comment threadlibrary/std/src/macros.rs
github-actionsBot pushed a commit to rust-lang/miri that referenced this pull request Jan 26, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request Jan 27, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust that referenced this pull request Feb 12, 2026
std: avoid tearing `dbg!` prints
Fixesrust-lang#136703.
This is an alternative to rust-lang#149859. Instead of formatting everything into a string, this PR makes multi-expression `dbg!` expand into multiple nested matches, with the final match containing a single `eprint!`. By using macro recursion and relying on hygiene, this allows naming every bound value in that `eprint!`.
CC @orlp
r? libs
cuviper added a commit to cuviper/rust that referenced this pull request Apr 8, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
@cuvipercuviper mentioned this pull request Apr 8, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
[^1]: #153850
[^2]: #154988
[^3]: #154406
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
Clippy is backporting 2 ICE fixes and 1 perf regression (via #155051):
- rust-lang/rust-clippy#16685 already backported in #154211 to stable. This makes sure that it doesn't regress again in beta/next stable
- rust-lang/rust-clippy#16659 The ICE that is being fixed here was introduced in the 1.95 release cycle
- rust-lang/rust-clippy#16652 Perf regression introduced in the 1.95 release cycle.
[^1]: #153850
[^2]: #154988
[^3]: #154406
@theemathas

Copy link
Copy Markdown
Contributor

Should there be release notes for this in 1.96.0?

rust-borsBot pushed a commit that referenced this pull request May 19, 2026
rust-borsBot pushed a commit that referenced this pull request May 19, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in #149869, we've been chasing a few regressions:
* #153850, fixed by #154074
* #154988, fixed by #154994
* #155902, proposed fix in #155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
cuviper added a commit to cuviper/rust that referenced this pull request May 20, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
(cherry picked from commit 9246e19)
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request May 20, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request May 28, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust that referenced this pull request May 28, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request May 30, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
pullBot pushed a commit to asukaminato0721/rust-analyzer that referenced this pull request Jun 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jun 8, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-clippyRelevant to the Clippy team.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dbg! prints can tear in multi-threading code

9 participants

@joboet@rust-log-analyzer@orlp@rustbot@bors@Mark-Simulacrum@theemathas@samueltardieu@Jamesbarford
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

std: avoid tearing dbg! prints - #149869

Merged
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg
Jan 25, 2026
Merged

std: avoid tearing dbg! prints#149869
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg

Conversation

@joboet

@joboetjoboet commented Dec 10, 2025

Copy link
Copy Markdown
Member

Fixes#136703.

This is an alternative to #149859. Instead of formatting everything into a string, this PR makes multi-expression dbg! expand into multiple nested matches, with the final match containing a single eprint!. By using macro recursion and relying on hygiene, this allows naming every bound value in that eprint!.

CC @orlp

r? libs

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 10, 2025
@joboetjoboet mentioned this pull request Dec 10, 2025
@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

Neat solution :) I wasn't sure if we could use helper macros.

Comment threadlibrary/std/src/macros.rs Outdated
@rustbotrustbot added the T-clippy Relevant to the Clippy team. label Dec 12, 2025
@joboet
joboet marked this pull request as ready for review December 12, 2025 12:25
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 12, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Dec 12, 2025
loop {
let [arm] = arms else { unreachable!("dbg! macro expansion only has single-arm matches") };

match is_async_move_desugar(arm.body).unwrap_or(arm.body).peel_drop_temps().kind {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this is really necessary, I just copied this from above.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is needed here. You can probably use match arm.body.kind { and add this extra test line to src/tools/clippy/tests/ui/dbg_macro/dbg_macro.rs (and bless the results with ./x test clippy --bless):

takes_async_fn(asyncmove |val| {dbg!(val, val + 1); val });//~^ dbg_macro

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

Is it allowed to change those error messages to leak those internal details?

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

@joboet

Copy link
Copy Markdown
MemberAuthor

Is it allowed to change those error messages to leak those internal details?

I don't think there's currently a way to tell the compiler to hide them unfortunately. But yes, this is fine, or at least there is precedent – the same happens for thread_local!: If you try

thread_local!{
#[rustc_align_static(42)]staticLOCAL:i32 = 42;}

(playground) on stable, the error message will reference $crate::thread::local_impl::thread_local_inner.

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details. I'm sure there is a way to abuse #[allow_internal_unstable] to make some macro arms unusable from stable, but I don't think its worth the hassle.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

@joboet

Copy link
Copy Markdown
MemberAuthor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

No, since the macro is perma-unstable 😏

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

@joboet

joboet commented Dec 13, 2025

Copy link
Copy Markdown
MemberAuthor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

dbg! is marked with #[allow_internal_unstable(std_internals)] which allows dbg_internal! to be used from code generated by the macro (but not in spans passed to the macro) despite it being an unstable feature. We use the same trick for thread_local!, since it too needs to invoke unstable helper macros, which need to use unstable features like #[thread_local] themselves.

Edit: So yes, essentially just stdlib magic sprinkles 😄

@bors

bors commented Dec 17, 2025

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #150068) made this pull request unmergeable. Please resolve the merge conflicts.

Comment threadlibrary/std/src/macros.rs
github-actionsBot pushed a commit to rust-lang/miri that referenced this pull request Jan 26, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request Jan 27, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust that referenced this pull request Feb 12, 2026
std: avoid tearing `dbg!` prints
Fixesrust-lang#136703.
This is an alternative to rust-lang#149859. Instead of formatting everything into a string, this PR makes multi-expression `dbg!` expand into multiple nested matches, with the final match containing a single `eprint!`. By using macro recursion and relying on hygiene, this allows naming every bound value in that `eprint!`.
CC @orlp
r? libs
cuviper added a commit to cuviper/rust that referenced this pull request Apr 8, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
@cuvipercuviper mentioned this pull request Apr 8, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
[^1]: #153850
[^2]: #154988
[^3]: #154406
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
Clippy is backporting 2 ICE fixes and 1 perf regression (via #155051):
- rust-lang/rust-clippy#16685 already backported in #154211 to stable. This makes sure that it doesn't regress again in beta/next stable
- rust-lang/rust-clippy#16659 The ICE that is being fixed here was introduced in the 1.95 release cycle
- rust-lang/rust-clippy#16652 Perf regression introduced in the 1.95 release cycle.
[^1]: #153850
[^2]: #154988
[^3]: #154406
@theemathas

Copy link
Copy Markdown
Contributor

Should there be release notes for this in 1.96.0?

rust-borsBot pushed a commit that referenced this pull request May 19, 2026
rust-borsBot pushed a commit that referenced this pull request May 19, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in #149869, we've been chasing a few regressions:
* #153850, fixed by #154074
* #154988, fixed by #154994
* #155902, proposed fix in #155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
cuviper added a commit to cuviper/rust that referenced this pull request May 20, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
(cherry picked from commit 9246e19)
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request May 20, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request May 28, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust that referenced this pull request May 28, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request May 30, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
pullBot pushed a commit to asukaminato0721/rust-analyzer that referenced this pull request Jun 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jun 8, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-clippyRelevant to the Clippy team.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dbg! prints can tear in multi-threading code

9 participants

@joboet@rust-log-analyzer@orlp@rustbot@bors@Mark-Simulacrum@theemathas@samueltardieu@Jamesbarford
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

std: avoid tearing dbg! prints - #149869

Merged
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg
Jan 25, 2026
Merged

std: avoid tearing dbg! prints#149869
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg

Conversation

@joboet

@joboetjoboet commented Dec 10, 2025

Copy link
Copy Markdown
Member

Fixes#136703.

This is an alternative to #149859. Instead of formatting everything into a string, this PR makes multi-expression dbg! expand into multiple nested matches, with the final match containing a single eprint!. By using macro recursion and relying on hygiene, this allows naming every bound value in that eprint!.

CC @orlp

r? libs

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 10, 2025
@joboetjoboet mentioned this pull request Dec 10, 2025
@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

Neat solution :) I wasn't sure if we could use helper macros.

Comment threadlibrary/std/src/macros.rs Outdated
@rustbotrustbot added the T-clippy Relevant to the Clippy team. label Dec 12, 2025
@joboet
joboet marked this pull request as ready for review December 12, 2025 12:25
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 12, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Dec 12, 2025
loop {
let [arm] = arms else { unreachable!("dbg! macro expansion only has single-arm matches") };

match is_async_move_desugar(arm.body).unwrap_or(arm.body).peel_drop_temps().kind {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this is really necessary, I just copied this from above.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is needed here. You can probably use match arm.body.kind { and add this extra test line to src/tools/clippy/tests/ui/dbg_macro/dbg_macro.rs (and bless the results with ./x test clippy --bless):

takes_async_fn(asyncmove |val| {dbg!(val, val + 1); val });//~^ dbg_macro

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

Is it allowed to change those error messages to leak those internal details?

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

@joboet

Copy link
Copy Markdown
MemberAuthor

Is it allowed to change those error messages to leak those internal details?

I don't think there's currently a way to tell the compiler to hide them unfortunately. But yes, this is fine, or at least there is precedent – the same happens for thread_local!: If you try

thread_local!{
#[rustc_align_static(42)]staticLOCAL:i32 = 42;}

(playground) on stable, the error message will reference $crate::thread::local_impl::thread_local_inner.

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details. I'm sure there is a way to abuse #[allow_internal_unstable] to make some macro arms unusable from stable, but I don't think its worth the hassle.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

@joboet

Copy link
Copy Markdown
MemberAuthor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

No, since the macro is perma-unstable 😏

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

@joboet

joboet commented Dec 13, 2025

Copy link
Copy Markdown
MemberAuthor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

dbg! is marked with #[allow_internal_unstable(std_internals)] which allows dbg_internal! to be used from code generated by the macro (but not in spans passed to the macro) despite it being an unstable feature. We use the same trick for thread_local!, since it too needs to invoke unstable helper macros, which need to use unstable features like #[thread_local] themselves.

Edit: So yes, essentially just stdlib magic sprinkles 😄

@bors

bors commented Dec 17, 2025

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #150068) made this pull request unmergeable. Please resolve the merge conflicts.

Comment threadlibrary/std/src/macros.rs
github-actionsBot pushed a commit to rust-lang/miri that referenced this pull request Jan 26, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request Jan 27, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust that referenced this pull request Feb 12, 2026
std: avoid tearing `dbg!` prints
Fixesrust-lang#136703.
This is an alternative to rust-lang#149859. Instead of formatting everything into a string, this PR makes multi-expression `dbg!` expand into multiple nested matches, with the final match containing a single `eprint!`. By using macro recursion and relying on hygiene, this allows naming every bound value in that `eprint!`.
CC @orlp
r? libs
cuviper added a commit to cuviper/rust that referenced this pull request Apr 8, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
@cuvipercuviper mentioned this pull request Apr 8, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
[^1]: #153850
[^2]: #154988
[^3]: #154406
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
Clippy is backporting 2 ICE fixes and 1 perf regression (via #155051):
- rust-lang/rust-clippy#16685 already backported in #154211 to stable. This makes sure that it doesn't regress again in beta/next stable
- rust-lang/rust-clippy#16659 The ICE that is being fixed here was introduced in the 1.95 release cycle
- rust-lang/rust-clippy#16652 Perf regression introduced in the 1.95 release cycle.
[^1]: #153850
[^2]: #154988
[^3]: #154406
@theemathas

Copy link
Copy Markdown
Contributor

Should there be release notes for this in 1.96.0?

rust-borsBot pushed a commit that referenced this pull request May 19, 2026
rust-borsBot pushed a commit that referenced this pull request May 19, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in #149869, we've been chasing a few regressions:
* #153850, fixed by #154074
* #154988, fixed by #154994
* #155902, proposed fix in #155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
cuviper added a commit to cuviper/rust that referenced this pull request May 20, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
(cherry picked from commit 9246e19)
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request May 20, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request May 28, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust that referenced this pull request May 28, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request May 30, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
pullBot pushed a commit to asukaminato0721/rust-analyzer that referenced this pull request Jun 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jun 8, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-clippyRelevant to the Clippy team.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dbg! prints can tear in multi-threading code

9 participants

@joboet@rust-log-analyzer@orlp@rustbot@bors@Mark-Simulacrum@theemathas@samueltardieu@Jamesbarford
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

std: avoid tearing dbg! prints - #149869

Merged
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg
Jan 25, 2026
Merged

std: avoid tearing dbg! prints#149869
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg

Conversation

@joboet

@joboetjoboet commented Dec 10, 2025

Copy link
Copy Markdown
Member

Fixes#136703.

This is an alternative to #149859. Instead of formatting everything into a string, this PR makes multi-expression dbg! expand into multiple nested matches, with the final match containing a single eprint!. By using macro recursion and relying on hygiene, this allows naming every bound value in that eprint!.

CC @orlp

r? libs

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 10, 2025
@joboetjoboet mentioned this pull request Dec 10, 2025
@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

Neat solution :) I wasn't sure if we could use helper macros.

Comment threadlibrary/std/src/macros.rs Outdated
@rustbotrustbot added the T-clippy Relevant to the Clippy team. label Dec 12, 2025
@joboet
joboet marked this pull request as ready for review December 12, 2025 12:25
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 12, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Dec 12, 2025
loop {
let [arm] = arms else { unreachable!("dbg! macro expansion only has single-arm matches") };

match is_async_move_desugar(arm.body).unwrap_or(arm.body).peel_drop_temps().kind {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this is really necessary, I just copied this from above.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is needed here. You can probably use match arm.body.kind { and add this extra test line to src/tools/clippy/tests/ui/dbg_macro/dbg_macro.rs (and bless the results with ./x test clippy --bless):

takes_async_fn(asyncmove |val| {dbg!(val, val + 1); val });//~^ dbg_macro

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

Is it allowed to change those error messages to leak those internal details?

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

@joboet

Copy link
Copy Markdown
MemberAuthor

Is it allowed to change those error messages to leak those internal details?

I don't think there's currently a way to tell the compiler to hide them unfortunately. But yes, this is fine, or at least there is precedent – the same happens for thread_local!: If you try

thread_local!{
#[rustc_align_static(42)]staticLOCAL:i32 = 42;}

(playground) on stable, the error message will reference $crate::thread::local_impl::thread_local_inner.

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details. I'm sure there is a way to abuse #[allow_internal_unstable] to make some macro arms unusable from stable, but I don't think its worth the hassle.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

@joboet

Copy link
Copy Markdown
MemberAuthor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

No, since the macro is perma-unstable 😏

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

@joboet

joboet commented Dec 13, 2025

Copy link
Copy Markdown
MemberAuthor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

dbg! is marked with #[allow_internal_unstable(std_internals)] which allows dbg_internal! to be used from code generated by the macro (but not in spans passed to the macro) despite it being an unstable feature. We use the same trick for thread_local!, since it too needs to invoke unstable helper macros, which need to use unstable features like #[thread_local] themselves.

Edit: So yes, essentially just stdlib magic sprinkles 😄

@bors

bors commented Dec 17, 2025

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #150068) made this pull request unmergeable. Please resolve the merge conflicts.

Comment threadlibrary/std/src/macros.rs
github-actionsBot pushed a commit to rust-lang/miri that referenced this pull request Jan 26, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request Jan 27, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust that referenced this pull request Feb 12, 2026
std: avoid tearing `dbg!` prints
Fixesrust-lang#136703.
This is an alternative to rust-lang#149859. Instead of formatting everything into a string, this PR makes multi-expression `dbg!` expand into multiple nested matches, with the final match containing a single `eprint!`. By using macro recursion and relying on hygiene, this allows naming every bound value in that `eprint!`.
CC @orlp
r? libs
cuviper added a commit to cuviper/rust that referenced this pull request Apr 8, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
@cuvipercuviper mentioned this pull request Apr 8, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
[^1]: #153850
[^2]: #154988
[^3]: #154406
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
Clippy is backporting 2 ICE fixes and 1 perf regression (via #155051):
- rust-lang/rust-clippy#16685 already backported in #154211 to stable. This makes sure that it doesn't regress again in beta/next stable
- rust-lang/rust-clippy#16659 The ICE that is being fixed here was introduced in the 1.95 release cycle
- rust-lang/rust-clippy#16652 Perf regression introduced in the 1.95 release cycle.
[^1]: #153850
[^2]: #154988
[^3]: #154406
@theemathas

Copy link
Copy Markdown
Contributor

Should there be release notes for this in 1.96.0?

rust-borsBot pushed a commit that referenced this pull request May 19, 2026
rust-borsBot pushed a commit that referenced this pull request May 19, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in #149869, we've been chasing a few regressions:
* #153850, fixed by #154074
* #154988, fixed by #154994
* #155902, proposed fix in #155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
cuviper added a commit to cuviper/rust that referenced this pull request May 20, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
(cherry picked from commit 9246e19)
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request May 20, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request May 28, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust that referenced this pull request May 28, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request May 30, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
pullBot pushed a commit to asukaminato0721/rust-analyzer that referenced this pull request Jun 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jun 8, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-clippyRelevant to the Clippy team.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dbg! prints can tear in multi-threading code

9 participants

@joboet@rust-log-analyzer@orlp@rustbot@bors@Mark-Simulacrum@theemathas@samueltardieu@Jamesbarford
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

std: avoid tearing dbg! prints - #149869

Merged
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg
Jan 25, 2026
Merged

std: avoid tearing dbg! prints#149869
rust-bors[bot] merged 3 commits into
rust-lang:mainfrom
joboet:torn-dbg

Conversation

@joboet

@joboetjoboet commented Dec 10, 2025

Copy link
Copy Markdown
Member

Fixes#136703.

This is an alternative to #149859. Instead of formatting everything into a string, this PR makes multi-expression dbg! expand into multiple nested matches, with the final match containing a single eprint!. By using macro recursion and relying on hygiene, this allows naming every bound value in that eprint!.

CC @orlp

r? libs

@rustbotrustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-libs Relevant to the library team, which will review and decide on the PR/issue. labels Dec 10, 2025
@joboetjoboet mentioned this pull request Dec 10, 2025
@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 11, 2025

Copy link
Copy Markdown
Contributor

Neat solution :) I wasn't sure if we could use helper macros.

Comment threadlibrary/std/src/macros.rs Outdated
@rustbotrustbot added the T-clippy Relevant to the Clippy team. label Dec 12, 2025
@joboet
joboet marked this pull request as ready for review December 12, 2025 12:25
@rustbotrustbot added the S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. label Dec 12, 2025
@rustbot

Copy link
Copy Markdown
Collaborator

Some changes occurred in src/tools/clippy

cc @rust-lang/clippy

@rustbotrustbot removed the S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. label Dec 12, 2025
loop {
let [arm] = arms else { unreachable!("dbg! macro expansion only has single-arm matches") };

match is_async_move_desugar(arm.body).unwrap_or(arm.body).peel_drop_temps().kind {

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure whether this is really necessary, I just copied this from above.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this is needed here. You can probably use match arm.body.kind { and add this extra test line to src/tools/clippy/tests/ui/dbg_macro/dbg_macro.rs (and bless the results with ./x test clippy --bless):

takes_async_fn(asyncmove |val| {dbg!(val, val + 1); val });//~^ dbg_macro

@rust-log-analyzer

This comment has been minimized.

@rust-log-analyzer

This comment has been minimized.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

Is it allowed to change those error messages to leak those internal details?

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

@joboet

Copy link
Copy Markdown
MemberAuthor

Is it allowed to change those error messages to leak those internal details?

I don't think there's currently a way to tell the compiler to hide them unfortunately. But yes, this is fine, or at least there is precedent – the same happens for thread_local!: If you try

thread_local!{
#[rustc_align_static(42)]staticLOCAL:i32 = 42;}

(playground) on stable, the error message will reference $crate::thread::local_impl::thread_local_inner.

An alternative is to stuff the helper macro into the main macro with some kind of marker that would otherwise never be legal, e.g. starting with the tokens => __internal_recursion:

macro_rules! foo {(=> __internal_recursion $x:expr) => {// ...};($x:expr) => {
foo!(=> __internal_recursion $x);};}

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details. I'm sure there is a way to abuse #[allow_internal_unstable] to make some macro arms unusable from stable, but I don't think its worth the hassle.

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

@rustbot

Copy link
Copy Markdown
Collaborator

The Miri subtree was changed

cc @rust-lang/miri

@joboet

Copy link
Copy Markdown
MemberAuthor

It would be legal to write these tokens in macro invocations in user code, so this would be an even worse leak of implementation details.

It would also be legal to directly write std::macros::dbg_internal!, no? So I don't see how it's better/worse in that regard.

No, since the macro is perma-unstable 😏

@orlp

orlp commented Dec 13, 2025

Copy link
Copy Markdown
Contributor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

@joboet

joboet commented Dec 13, 2025

Copy link
Copy Markdown
MemberAuthor

How does that work once the macro expands? Does it not expand in the user's context? Or is this just stdlib magic sprinkles?

dbg! is marked with #[allow_internal_unstable(std_internals)] which allows dbg_internal! to be used from code generated by the macro (but not in spans passed to the macro) despite it being an unstable feature. We use the same trick for thread_local!, since it too needs to invoke unstable helper macros, which need to use unstable features like #[thread_local] themselves.

Edit: So yes, essentially just stdlib magic sprinkles 😄

@bors

bors commented Dec 17, 2025

Copy link
Copy Markdown
Collaborator

☔ The latest upstream changes (presumably #150068) made this pull request unmergeable. Please resolve the merge conflicts.

Comment threadlibrary/std/src/macros.rs
github-actionsBot pushed a commit to rust-lang/miri that referenced this pull request Jan 26, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
lnicola pushed a commit to lnicola/rust-analyzer that referenced this pull request Jan 27, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust that referenced this pull request Feb 12, 2026
std: avoid tearing `dbg!` prints
Fixesrust-lang#136703.
This is an alternative to rust-lang#149859. Instead of formatting everything into a string, this PR makes multi-expression `dbg!` expand into multiple nested matches, with the final match containing a single `eprint!`. By using macro recursion and relying on hygiene, this allows naming every bound value in that `eprint!`.
CC @orlp
r? libs
cuviper added a commit to cuviper/rust that referenced this pull request Apr 8, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
@cuvipercuviper mentioned this pull request Apr 8, 2026
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
[^1]: #153850
[^2]: #154988
[^3]: #154406
rust-borsBot pushed a commit that referenced this pull request Apr 9, 2026
[beta] reverts and backports
This reverts two `dbg!` changes to avoid regressions[^1][^2] in the upcoming 1.95 release:
- std: avoid tearing `dbg!` prints #149869
- don't drop arguments' temporaries in `dbg!` #154074
- ... which was previously backported in #154725
This also reverts a stabilization over a late issue[^3] of semantics:
- Stabilize `assert_matches` #137487
And a few other backport/reverts from `main`:
- Revert performing basic const checks in typeck on stable #154930 / #155033
- Revert "`-Znext-solver` Remove the forced ambiguity hack from search graph" #154712
- Clarify that core::range ranges do not have special syntax #155002
Clippy is backporting 2 ICE fixes and 1 perf regression (via #155051):
- rust-lang/rust-clippy#16685 already backported in #154211 to stable. This makes sure that it doesn't regress again in beta/next stable
- rust-lang/rust-clippy#16659 The ICE that is being fixed here was introduced in the 1.95 release cycle
- rust-lang/rust-clippy#16652 Perf regression introduced in the 1.95 release cycle.
[^1]: #153850
[^2]: #154988
[^3]: #154406
@theemathas

Copy link
Copy Markdown
Contributor

Should there be release notes for this in 1.96.0?

rust-borsBot pushed a commit that referenced this pull request May 19, 2026
rust-borsBot pushed a commit that referenced this pull request May 19, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in #149869, we've been chasing a few regressions:
* #153850, fixed by #154074
* #154988, fixed by #154994
* #155902, proposed fix in #155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
cuviper added a commit to cuviper/rust that referenced this pull request May 20, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
(cherry picked from commit 9246e19)
pullBot pushed a commit to xtqqczze/rust-lang-miri that referenced this pull request May 20, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request May 28, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust that referenced this pull request May 28, 2026
…mulacrum"
This reverts commit cc666ba, reversing
changes made to 2da5959.
github-actionsBot pushed a commit to rust-lang/rustc-dev-guide that referenced this pull request May 30, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
pullBot pushed a commit to asukaminato0721/rust-analyzer that referenced this pull request Jun 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
github-actionsBot pushed a commit to rust-lang/stdarch that referenced this pull request Jun 8, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne@rust-lang/libs@rustbot label beta-nominated
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
ghaaj pushed a commit to ghaaj/polygrammar that referenced this pull request Aug 7, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Rollup of 10 pull requests
Successful merges:
- rust-lang/rust#145393 (Add codegen test for removing trailing zeroes from `NonZero`)
- rust-lang/rust#148764 (ptr_aligment_type: add more APIs)
- rust-lang/rust#149869 (std: avoid tearing `dbg!` prints)
- rust-lang/rust#150065 (add CSE optimization tests for iterating over slice)
- rust-lang/rust#150842 (Fix(lib/win/thread): Ensure `Sleep`'s usage passes over the requested duration under Win7)
- rust-lang/rust#151505 (Various refactors to the proc_macro bridge)
- rust-lang/rust#151560 (relnotes: fix 1.93's `as_mut_array` methods)
- rust-lang/rust#151317 (x86 soft-float feature: mark it as forbidden rather than unstable)
- rust-lang/rust#151577 (Rename `DepKindStruct` to `DepKindVTable`)
- rust-lang/rust#151620 (Fix 'the the' typo in library/core/src/array/iter.rs)
flip1995 pushed a commit to flip1995/rust-clippy that referenced this pull request Aug 17, 2026
Revert tearing changes to `dbg!`
Since the primary change to `dbg!` in rust-lang/rust#149869, we've been chasing a few regressions:
* rust-lang/rust#153850, fixed by rust-lang/rust#154074
* rust-lang/rust#154988, fixed by rust-lang/rust#154994
* rust-lang/rust#155902, proposed fix in rust-lang/rust#155915
We already reverted this once, on beta only to prevent these regressions from shipping in 1.95.
In that most recent PR, we decided that it would be better to revert `dbg!` to its original state everywhere (`main` and 1.96-`beta`), and then we can consider it from scratch later. So here I've reverted the change and its fixes, but kept the regression tests, including the pending one.
cc @joboet@dianne @rust-lang/libs @rustbot label beta-nominated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

S-waiting-on-borsStatus: Waiting on bors to run and complete tests. Bors will change the label on completion.T-clippyRelevant to the Clippy team.T-libsRelevant to the library team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dbg! prints can tear in multi-threading code

9 participants

@joboet@rust-log-analyzer@orlp@rustbot@bors@Mark-Simulacrum@theemathas@samueltardieu@Jamesbarford