From 442a57432d14af0c3f0199eec1caf99117ac5a08 Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Fri, 28 Nov 2025 17:53:52 +0000 Subject: [PATCH 1/7] replace valueset with valueset_all --- tracing/src/macros.rs | 90 +++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/tracing/src/macros.rs b/tracing/src/macros.rs index 6e6bc2f56..085752d9e 100644 --- a/tracing/src/macros.rs +++ b/tracing/src/macros.rs @@ -41,12 +41,12 @@ macro_rules! span { $crate::Span::child_of( $parent, meta, - &$crate::valueset!(meta.fields(), $($fields)*), + &$crate::valueset_all!(meta.fields(), $($fields)*), ) } else { let span = $crate::__macro_support::__disabled_span(__CALLSITE.metadata()); $crate::if_log_enabled! { $lvl, { - span.record_all(&$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + span.record_all(&$crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*)); }}; span } @@ -71,12 +71,12 @@ macro_rules! span { // span with contextual parent $crate::Span::new( meta, - &$crate::valueset!(meta.fields(), $($fields)*), + &$crate::valueset_all!(meta.fields(), $($fields)*), ) } else { let span = $crate::__macro_support::__disabled_span(__CALLSITE.metadata()); $crate::if_log_enabled! { $lvl, { - span.record_all(&$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + span.record_all(&$crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*)); }}; span } @@ -152,7 +152,7 @@ macro_rules! span { macro_rules! record_all { ($span:expr, $($fields:tt)*) => { if let Some(meta) = $span.metadata() { - $span.record_all(&$crate::valueset!( + $span.record_all(&$crate::valueset_all!( meta.fields(), $($fields)* )); @@ -642,12 +642,12 @@ macro_rules! event { meta, &value_set ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + })($crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*)); } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + &$crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*) ); } }); @@ -694,12 +694,12 @@ macro_rules! event { __CALLSITE, &value_set ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + })($crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*)); } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + &$crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*) ); } }); @@ -752,12 +752,12 @@ macro_rules! event { meta, &value_set ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + })($crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*)); } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + &$crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*) ); } }); @@ -805,12 +805,12 @@ macro_rules! event { meta, &value_set ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + })($crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*)); } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + &$crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*) ); } }); @@ -856,12 +856,12 @@ macro_rules! event { __CALLSITE, &value_set ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + })($crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*)); } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + &$crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*) ); } }); @@ -911,12 +911,12 @@ macro_rules! event { __CALLSITE, &value_set ); - })($crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*)); + })($crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*)); } else { $crate::__tracing_log!( $lvl, __CALLSITE, - &$crate::valueset!(__CALLSITE.metadata().fields(), $($fields)*) + &$crate::valueset_all!(__CALLSITE.metadata().fields(), $($fields)*) ); } }); @@ -2811,7 +2811,7 @@ macro_rules! level_enabled { #[doc(hidden)] #[macro_export] -macro_rules! valueset { +macro_rules! valueset_all { // === base case === (@ { $(,)* $($val:expr),* $(,)* } $(,)*) => { @@ -2823,148 +2823,148 @@ macro_rules! valueset { // TODO(#1138): determine a new syntax for uninitialized span fields, and // re-enable this. // (@{ $(,)* $($out:expr),* }, $($k:ident).+ = _, $($rest:tt)*) => { - // $crate::valueset!(@ { $($out),*, (None) }, $($rest)*) + // $crate::valueset_all!(@ { $($out),*, (None) }, $($rest)*) // }; (@ { $(,)* $($out:expr),* }, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $($k:ident).+ = $val:expr, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $($k:ident).+, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, ?$($k:ident).+, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, %$($k:ident).+, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $($k:ident).+ = ?$val:expr) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, ) }; (@ { $(,)* $($out:expr),* }, $($k:ident).+ = %$val:expr) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, ) }; (@ { $(,)* $($out:expr),* }, $($k:ident).+ = $val:expr) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, ) }; (@ { $(,)* $($out:expr),* }, $($k:ident).+) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, ) }; (@ { $(,)* $($out:expr),* }, ?$($k:ident).+) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, ) }; (@ { $(,)* $($out:expr),* }, %$($k:ident).+) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, ) }; // Handle literal names (@ { $(,)* $($out:expr),* }, $k:literal = ?$val:expr, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $k:literal = %$val:expr, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $k:literal = $val:expr, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, $k:literal = ?$val:expr) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, ) }; (@ { $(,)* $($out:expr),* }, $k:literal = %$val:expr) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, ) }; (@ { $(,)* $($out:expr),* }, $k:literal = $val:expr) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, ($crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, ) }; // Handle constant names (@ { $(,)* $($out:expr),* }, { $k:expr } = ?$val:expr, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, (Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, { $k:expr } = %$val:expr, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, (Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, { $k:expr } = $val:expr, $($rest:tt)*) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, (Some(&$val as &dyn $crate::field::Value)) }, $($rest)* ) }; (@ { $(,)* $($out:expr),* }, { $k:expr } = ?$val:expr) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, (Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, ) }; (@ { $(,)* $($out:expr),* }, { $k:expr } = %$val:expr) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, (Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, ) }; (@ { $(,)* $($out:expr),* }, { $k:expr } = $val:expr) => { - $crate::valueset!( + $crate::valueset_all!( @ { $($out),*, (Some(&$val as &dyn $crate::field::Value)) }, ) }; // Remainder is unparsable, but exists --- must be format args! (@ { $(,)* $($out:expr),* }, $($rest:tt)+) => { - $crate::valueset!(@ { ($crate::__macro_support::Option::Some(&$crate::__macro_support::format_args!($($rest)+) as &dyn $crate::field::Value)), $($out),* },) + $crate::valueset_all!(@ { ($crate::__macro_support::Option::Some(&$crate::__macro_support::format_args!($($rest)+) as &dyn $crate::field::Value)), $($out),* },) }; // === entry === @@ -2974,7 +2974,7 @@ macro_rules! valueset { // This import statement CANNOT be removed as it will break existing use cases. // See #831, #2332, #3424 for the last times we tried. use $crate::field::{debug, display, Value}; - $fields.value_set_all($crate::valueset!( + $fields.value_set_all($crate::valueset_all!( @ { }, $($kvs)+ )) From 2b26d4152c97f143bd034f9a716bbd1b7c50eecf Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Fri, 28 Nov 2025 17:56:06 +0000 Subject: [PATCH 2/7] restore original valueset from before #3398 --- tracing/src/macros.rs | 209 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 208 insertions(+), 1 deletion(-) diff --git a/tracing/src/macros.rs b/tracing/src/macros.rs index 085752d9e..5f628d7f2 100644 --- a/tracing/src/macros.rs +++ b/tracing/src/macros.rs @@ -152,7 +152,7 @@ macro_rules! span { macro_rules! record_all { ($span:expr, $($fields:tt)*) => { if let Some(meta) = $span.metadata() { - $span.record_all(&$crate::valueset_all!( + $span.record_all(&$crate::valueset!( meta.fields(), $($fields)* )); @@ -2987,6 +2987,213 @@ macro_rules! valueset_all { }; } +#[doc(hidden)] +#[macro_export] +macro_rules! valueset { + + // === base case === + (@ { $(,)* $($val:expr),* $(,)* }, $next:expr $(,)*) => { + &[ $($val),* ] + }; + + // === recursive case (more tts) === + + // TODO(#1138): determine a new syntax for uninitialized span fields, and + // re-enable this. + // (@{ $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = _, $($rest:tt)*) => { + // $crate::valueset!(@ { $($out),*, (&$next, None) }, $next, $($rest)*) + // }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + $next, + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + $next, + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, + $next, + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, + $next, + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, + $next, + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, + $next, + ) + }; + + // Handle literal names + (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + $next, + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + $next, + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, + $next, + ) + }; + + // Handle constant names + (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr, $($rest:tt)*) => { + $crate::valueset!( + @ { $($out),*, (&$next, Some(&$val as &dyn $crate::field::Value)) }, + $next, + $($rest)* + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + $next, + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + $next, + ) + }; + (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr) => { + $crate::valueset!( + @ { $($out),*, (&$next, Some(&$val as &dyn $crate::field::Value)) }, + $next, + ) + }; + + // Remainder is unparsable, but exists --- must be format args! + (@ { $(,)* $($out:expr),* }, $next:expr, $($rest:tt)+) => { + $crate::valueset!( + @ { (&$next, $crate::__macro_support::Option::Some(&$crate::__macro_support::format_args!($($rest)+) as &dyn $crate::field::Value)), $($out),* }, + $next, + ) + }; + + // === entry === + ($fields:expr, $($kvs:tt)+) => { + { + let mut iter = $fields.iter(); + #[allow(unused_imports)] + // This import statement CANNOT be removed as it will break existing use cases. + // See #831, #2332, #3424 for the last times we tried. + use $crate::field::{debug, display, Value}; + $fields.value_set($crate::valueset!( + @ { }, + $crate::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"), + $($kvs)+ + )) + } + }; + ($fields:expr,) => { + { + $fields.value_set(&[]) + } + }; +} + #[doc(hidden)] #[macro_export] macro_rules! fieldset { From 5e955221754e8fd5b1f36727de5b6e9fa3422137 Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Fri, 28 Nov 2025 17:59:07 +0000 Subject: [PATCH 3/7] add regression test --- tracing/tests/span.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tracing/tests/span.rs b/tracing/tests/span.rs index b9a1d148d..37d45f42f 100644 --- a/tracing/tests/span.rs +++ b/tracing/tests/span.rs @@ -630,7 +630,7 @@ fn record_all_macro_records_new_values_for_fields() { expect::span().named("foo"), expect::field("bar") .with_value(&5) - .and(expect::field("baz").with_value(&"BAZ")) + .and(expect::field("baz").with_value(&2)) .and(expect::field("qux").with_value(&display("qux"))) .and(expect::field("quux").with_value(&debug("QuuX"))) .only(), @@ -650,7 +650,7 @@ fn record_all_macro_records_new_values_for_fields() { qux = Empty, quux = Empty ); - record_all!(span, bar = 5, baz = "BAZ", qux = %"qux", quux = ?"QuuX"); + record_all!(span, bar = 5, qux = %"qux", quux = ?"QuuX"); span.in_scope(|| {}) }); From fe8b8875d7f470726b70615ad067c51370f5851a Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Fri, 28 Nov 2025 18:52:53 +0000 Subject: [PATCH 4/7] fix record_all --- tracing/src/macros.rs | 160 ++++++++++++++++++------------------------ tracing/tests/span.rs | 3 +- 2 files changed, 70 insertions(+), 93 deletions(-) diff --git a/tracing/src/macros.rs b/tracing/src/macros.rs index 5f628d7f2..2922f404b 100644 --- a/tracing/src/macros.rs +++ b/tracing/src/macros.rs @@ -2992,197 +2992,175 @@ macro_rules! valueset_all { macro_rules! valueset { // === base case === - (@ { $(,)* $($val:expr),* $(,)* }, $next:expr $(,)*) => { - &[ $($val),* ] - }; + (@ $fields:expr, { $(,)* $(($field:expr, $val:expr)),* $(,)* } $(,)*) => {{ + use $crate::__macro_support::Callsite as _; + // create a dummy callsite to get a bogus field. + static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! { + name: "__fake_tracing_callsite", + kind: $crate::metadata::Kind::SPAN, + target: module_path!(), + level: $crate::Level::TRACE, + fields: $crate::fieldset!("__fake_tracing_field" = "fake_tracing_value"), + }; + + &[ + $( + ( + &$fields.field($field).unwrap_or_else(|| __CALLSITE.metadata().fields().iter().next().unwrap()), + $val, + ), + )* + ] + }}; // === recursive case (more tts) === - // TODO(#1138): determine a new syntax for uninitialized span fields, and - // re-enable this. - // (@{ $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = _, $($rest:tt)*) => { - // $crate::valueset!(@ { $($out),*, (&$next, None) }, $next, $($rest)*) - // }; - (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = $val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, ?$($k:ident).+, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, %$($k:ident).+, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = ?$val:expr) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = ?$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = %$val:expr) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = %$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+ = $val:expr) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = $val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $($k:ident).+) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, ?$($k:ident).+) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, ?$($k:ident).+) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, %$($k:ident).+) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, %$($k:ident).+) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, ) }; // Handle literal names - (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = ?$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = %$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = $val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = ?$val:expr) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = ?$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = %$val:expr) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = %$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, $k:literal = $val:expr) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = $val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, ) }; // Handle constant names - (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = ?$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = %$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr, $($rest:tt)*) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = $val:expr, $($rest:tt)*) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&$val as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, Some(&$val as &dyn $crate::field::Value)) }, $($rest)* ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = ?$val:expr) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = ?$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = %$val:expr) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = %$val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, - $next, + @ $fields, { $(($field, $out)),*, ($k, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, ) }; - (@ { $(,)* $($out:expr),* }, $next:expr, { $k:expr } = $val:expr) => { + (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = $val:expr) => { $crate::valueset!( - @ { $($out),*, (&$next, Some(&$val as &dyn $crate::field::Value)) }, - $next, - ) - }; - - // Remainder is unparsable, but exists --- must be format args! - (@ { $(,)* $($out:expr),* }, $next:expr, $($rest:tt)+) => { - $crate::valueset!( - @ { (&$next, $crate::__macro_support::Option::Some(&$crate::__macro_support::format_args!($($rest)+) as &dyn $crate::field::Value)), $($out),* }, - $next, + @ $fields, { $(($field, $out)),*, ($k, Some(&$val as &dyn $crate::field::Value)) }, ) }; // === entry === ($fields:expr, $($kvs:tt)+) => { { - let mut iter = $fields.iter(); #[allow(unused_imports)] // This import statement CANNOT be removed as it will break existing use cases. // See #831, #2332, #3424 for the last times we tried. use $crate::field::{debug, display, Value}; $fields.value_set($crate::valueset!( - @ { }, - $crate::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"), + @ $fields, { }, $($kvs)+ )) } diff --git a/tracing/tests/span.rs b/tracing/tests/span.rs index 37d45f42f..60cc3c0e2 100644 --- a/tracing/tests/span.rs +++ b/tracing/tests/span.rs @@ -630,7 +630,6 @@ fn record_all_macro_records_new_values_for_fields() { expect::span().named("foo"), expect::field("bar") .with_value(&5) - .and(expect::field("baz").with_value(&2)) .and(expect::field("qux").with_value(&display("qux"))) .and(expect::field("quux").with_value(&debug("QuuX"))) .only(), @@ -650,7 +649,7 @@ fn record_all_macro_records_new_values_for_fields() { qux = Empty, quux = Empty ); - record_all!(span, bar = 5, qux = %"qux", quux = ?"QuuX"); + record_all!(span, bar = 5, qux = %"qux", quux = ?"QuuX", unknown = "unknown"); span.in_scope(|| {}) }); From 38c912c41956bdba8117149ec933e17ea593d2b3 Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Tue, 2 Dec 2025 11:07:49 +0000 Subject: [PATCH 5/7] add refined tests --- tracing/tests/span.rs | 115 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/tracing/tests/span.rs b/tracing/tests/span.rs index 60cc3c0e2..2561b4fc0 100644 --- a/tracing/tests/span.rs +++ b/tracing/tests/span.rs @@ -656,6 +656,121 @@ fn record_all_macro_records_new_values_for_fields() { handle.assert_finished(); } +#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] +#[test] +fn record_all_macro_records_all_fields() { + let (subscriber, handle) = subscriber::mock() + .new_span( + expect::span() + .named("foo") + .with_fields(expect::field("bar")), + ) + .record( + expect::span().named("foo"), + expect::field("bar") + .with_value(&5) + .and(expect::field("baz").with_value(&6)) + .and(expect::field("qux").with_value(&display("qux"))) + .and(expect::field("quux").with_value(&debug("QuuX"))) + .only(), + ) + .enter(expect::span().named("foo")) + .exit(expect::span().named("foo")) + .drop_span(expect::span().named("foo")) + .only() + .run_with_handle(); + + with_default(subscriber, || { + let span = tracing::span!( + Level::TRACE, + "foo", + bar = 1, + baz = 2, + qux = Empty, + quux = Empty + ); + record_all!(span, bar = 5, baz = 6, qux = %"qux", quux = ?"QuuX"); + span.in_scope(|| {}) + }); + + handle.assert_finished(); +} + +#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] +#[test] +fn record_all_macro_records_all_fields_different_order() { + let (subscriber, handle) = subscriber::mock() + .new_span( + expect::span() + .named("foo") + .with_fields(expect::field("bar")), + ) + .record( + expect::span().named("foo"), + expect::field("bar") + .with_value(&5) + .and(expect::field("baz").with_value(&6)) + .and(expect::field("qux").with_value(&display("qux"))) + .and(expect::field("quux").with_value(&debug("QuuX"))) + .only(), + ) + .enter(expect::span().named("foo")) + .exit(expect::span().named("foo")) + .drop_span(expect::span().named("foo")) + .only() + .run_with_handle(); + + with_default(subscriber, || { + let span = tracing::span!( + Level::TRACE, + "foo", + bar = 1, + baz = 2, + qux = Empty, + quux = Empty + ); + record_all!(span, qux = %"qux", baz = 6, bar = 5, quux = ?"QuuX"); + span.in_scope(|| {}) + }); + + handle.assert_finished(); +} + +#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] +#[test] +fn record_all_macro_unknown_field() { + let (subscriber, handle) = subscriber::mock() + .new_span( + expect::span() + .named("foo") + .with_fields(expect::field("bar")), + ) + .record( + expect::span().named("foo"), + tracing_mock::field::ExpectedFields::default().only(), + ) + .enter(expect::span().named("foo")) + .exit(expect::span().named("foo")) + .drop_span(expect::span().named("foo")) + .only() + .run_with_handle(); + + with_default(subscriber, || { + let span = tracing::span!( + Level::TRACE, + "foo", + bar = 1, + baz = 2, + qux = Empty, + quux = Empty + ); + record_all!(span, unknown = "unknown"); + span.in_scope(|| {}) + }); + + handle.assert_finished(); +} + #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] #[test] fn new_span_with_target_and_log_level() { From 650894d3a4bbed0a3ee138ab619f60017250d6fd Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Wed, 10 Dec 2025 11:33:08 +0000 Subject: [PATCH 6/7] abstract the fake field construction --- tracing-core/src/field.rs | 12 ++++++- tracing-core/src/metadata.rs | 8 +++++ tracing/src/lib.rs | 18 +++++++++++ tracing/src/macros.rs | 61 +++++++++++++++--------------------- 4 files changed, 63 insertions(+), 36 deletions(-) diff --git a/tracing-core/src/field.rs b/tracing-core/src/field.rs index 988336914..69544f9f3 100644 --- a/tracing-core/src/field.rs +++ b/tracing-core/src/field.rs @@ -876,7 +876,7 @@ impl FieldSet { /// [`Identifier`]: super::callsite::Identifier /// [`Callsite`]: super::callsite::Callsite #[inline] - pub(crate) fn callsite(&self) -> callsite::Identifier { + pub(crate) const fn callsite(&self) -> callsite::Identifier { callsite::Identifier(self.callsite.0) } @@ -949,6 +949,16 @@ impl FieldSet { } } + pub(crate) const fn fake_field(&self) -> Field { + Field { + i: usize::MAX, + fields: FieldSet { + names: self.names, + callsite: self.callsite(), + }, + } + } + /// Returns the number of fields in this `FieldSet`. #[inline] pub fn len(&self) -> usize { diff --git a/tracing-core/src/metadata.rs b/tracing-core/src/metadata.rs index cac6d7a0a..308b8529e 100644 --- a/tracing-core/src/metadata.rs +++ b/tracing-core/src/metadata.rs @@ -330,6 +330,14 @@ impl<'a> Metadata<'a> { pub fn is_span(&self) -> bool { self.kind.is_span() } + + /// Generate a fake field that will never match a real field. + /// + /// Used via valueset to fill in for unknown fields. + #[doc(hidden)] + pub const fn private_fake_field(&self) -> field::Field { + self.fields.fake_field() + } } impl fmt::Debug for Metadata<'_> { diff --git a/tracing/src/lib.rs b/tracing/src/lib.rs index 2a058e533..690bcdc8e 100644 --- a/tracing/src/lib.rs +++ b/tracing/src/lib.rs @@ -1127,6 +1127,24 @@ pub mod __macro_support { .finish() } } + + /// Generate a fake field that will never match a real field. + /// + /// Used via valueset to fill in for unknown fields. + pub const fn fake_field() -> crate::field::Field { + static CALLSITE: crate::callsite::DefaultCallsite = + crate::callsite::DefaultCallsite::new(&META); + static META: crate::Metadata<'static> = crate::metadata! { + name: "__fake_tracing_callsite", + target: module_path!(), + level: crate::Level::TRACE, + fields: crate::fieldset!(), + callsite: &CALLSITE, + kind: crate::metadata::Kind::SPAN, + }; + + META.private_fake_field() + } } #[cfg(feature = "log")] diff --git a/tracing/src/macros.rs b/tracing/src/macros.rs index 2922f404b..909884019 100644 --- a/tracing/src/macros.rs +++ b/tracing/src/macros.rs @@ -2993,21 +2993,12 @@ macro_rules! valueset { // === base case === (@ $fields:expr, { $(,)* $(($field:expr, $val:expr)),* $(,)* } $(,)*) => {{ - use $crate::__macro_support::Callsite as _; - // create a dummy callsite to get a bogus field. - static __CALLSITE: $crate::callsite::DefaultCallsite = $crate::callsite2! { - name: "__fake_tracing_callsite", - kind: $crate::metadata::Kind::SPAN, - target: module_path!(), - level: $crate::Level::TRACE, - fields: $crate::fieldset!("__fake_tracing_field" = "fake_tracing_value"), - }; &[ $( ( - &$fields.field($field).unwrap_or_else(|| __CALLSITE.metadata().fields().iter().next().unwrap()), - $val, + &$fields.field($field).unwrap_or_else($crate::__macro_support::fake_field), + $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value), ), )* ] @@ -3017,138 +3008,138 @@ macro_rules! valueset { (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = ?$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::field::debug(&$val)) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = %$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::field::display(&$val)) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = $val:expr, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $val) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $($k).+) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, ?$($k:ident).+, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::field::debug(&$($k).+)) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, %$($k:ident).+, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::field::display(&$($k).+)) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = ?$val:expr) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::field::debug(&$val)) }, ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = %$val:expr) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::field::display(&$val)) }, ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+ = $val:expr) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $val) }, ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $($k:ident).+) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$($k).+ as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $($k).+) }, ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, ?$($k:ident).+) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::debug(&$($k).+) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::field::debug(&$($k).+)) }, ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, %$($k:ident).+) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::__macro_support::Option::Some(&$crate::field::display(&$($k).+) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($crate::__tracing_stringify!($($k).+), $crate::field::display(&$($k).+)) }, ) }; // Handle literal names (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = ?$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $crate::field::debug(&$val)) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = %$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $crate::field::display(&$val)) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = $val:expr, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $val) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = ?$val:expr) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $crate::field::debug(&$val)) }, ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = %$val:expr) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $crate::field::display(&$val)) }, ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, $k:literal = $val:expr) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $val) }, ) }; // Handle constant names (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = ?$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $crate::field::debug(&$val)) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = %$val:expr, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $crate::field::display(&$val)) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = $val:expr, $($rest:tt)*) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, Some(&$val as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $val) }, $($rest)* ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = ?$val:expr) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, Some(&$crate::field::debug(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $crate::field::debug(&$val)) }, ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = %$val:expr) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, Some(&$crate::field::display(&$val) as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $crate::field::display(&$val)) }, ) }; (@ $fields:expr, { $(,)* $(($field:expr, $out:expr)),* }, { $k:expr } = $val:expr) => { $crate::valueset!( - @ $fields, { $(($field, $out)),*, ($k, Some(&$val as &dyn $crate::field::Value)) }, + @ $fields, { $(($field, $out)),*, ($k, $val) }, ) }; From 4b15affbcd285f02590bbf73ebcd71bfb8b8ff77 Mon Sep 17 00:00:00 2001 From: Conrad Ludgate Date: Wed, 10 Dec 2025 12:53:57 +0000 Subject: [PATCH 7/7] try fix msrv const error --- tracing/src/lib.rs | 28 +++++++++++----------------- tracing/src/macros.rs | 11 ++++------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/tracing/src/lib.rs b/tracing/src/lib.rs index 690bcdc8e..f8ac83f1e 100644 --- a/tracing/src/lib.rs +++ b/tracing/src/lib.rs @@ -1128,23 +1128,17 @@ pub mod __macro_support { } } - /// Generate a fake field that will never match a real field. - /// - /// Used via valueset to fill in for unknown fields. - pub const fn fake_field() -> crate::field::Field { - static CALLSITE: crate::callsite::DefaultCallsite = - crate::callsite::DefaultCallsite::new(&META); - static META: crate::Metadata<'static> = crate::metadata! { - name: "__fake_tracing_callsite", - target: module_path!(), - level: crate::Level::TRACE, - fields: crate::fieldset!(), - callsite: &CALLSITE, - kind: crate::metadata::Kind::SPAN, - }; - - META.private_fake_field() - } + static CALLSITE: crate::callsite::DefaultCallsite = + crate::callsite::DefaultCallsite::new(&META); + static META: crate::Metadata<'static> = crate::metadata! { + name: "__fake_tracing_callsite", + target: module_path!(), + level: crate::Level::TRACE, + fields: crate::fieldset!(), + callsite: &CALLSITE, + kind: crate::metadata::Kind::SPAN, + }; + pub static FAKE_FIELD: crate::field::Field = META.private_fake_field(); } #[cfg(feature = "log")] diff --git a/tracing/src/macros.rs b/tracing/src/macros.rs index 909884019..14481c0a1 100644 --- a/tracing/src/macros.rs +++ b/tracing/src/macros.rs @@ -2993,14 +2993,11 @@ macro_rules! valueset { // === base case === (@ $fields:expr, { $(,)* $(($field:expr, $val:expr)),* $(,)* } $(,)*) => {{ - &[ - $( - ( - &$fields.field($field).unwrap_or_else($crate::__macro_support::fake_field), - $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value), - ), - )* + $(( + $fields.field($field).as_ref().unwrap_or(&$crate::__macro_support::FAKE_FIELD), + $crate::__macro_support::Option::Some(&$val as &dyn $crate::field::Value), + ),)* ] }};