log/slog — validation proof
Go’s own log/slog test suite, converted to C# by go2cs, built against the converted standard
library, run under the Go-semantics test host, and compared verdict for verdict against a clean
go test -json baseline of the same sources. This page is generated by the converter from that
comparison — it is the evidence behind the log/slog row in
Validated Test Packages.
Validated 2026-10-25 · converter 3e3f18925
228 matched · 21 disclosed — Go 1.26.10, windows/amd64, converted package
src/core/log/slog.
Measured at Release (tiered JIT off), oracle go version go1.26.10 windows/amd64.
Verdicts
| Test | go test |
go2cs |
|---|---|---|
TestAliasingAndClone |
pass | pass |
TestAlloc |
pass | fail (disclosed) |
TestAlloc/2_pairs |
pass | fail (disclosed) |
TestAlloc/2_pairs_disabled |
pass | pass |
TestAlloc/2_pairs_disabled_inline |
pass | fail (disclosed) |
TestAlloc/9_kvs |
pass | fail (disclosed) |
TestAlloc/Error |
pass | fail (disclosed) |
TestAlloc/Info |
pass | fail (disclosed) |
TestAlloc/attrs1 |
pass | fail (disclosed) |
TestAlloc/attrs3 |
pass | fail (disclosed) |
TestAlloc/attrs3_disabled |
pass | fail (disclosed) |
TestAlloc/attrs6 |
pass | fail (disclosed) |
TestAlloc/attrs9 |
pass | fail (disclosed) |
TestAlloc/logger.Info |
pass | fail (disclosed) |
TestAlloc/logger.Log |
pass | fail (disclosed) |
TestAlloc/pairs |
pass | fail (disclosed) |
TestAnyLevelAlloc |
pass | fail (disclosed) |
TestAnyValue |
pass | pass |
TestAppendJSONValue |
pass | pass |
TestAttrNoAlloc |
pass | fail (disclosed) |
TestAttrs |
pass | pass |
TestCallDepth |
pass | pass |
TestCallDepthConnection |
pass | pass |
TestCallDepthConnection/log.Default.Fatal |
pass | pass |
TestCallDepthConnection/log.Default.Fatalf |
pass | pass |
TestCallDepthConnection/log.Default.Fatalln |
pass | pass |
TestCallDepthConnection/log.Default.Output |
pass | pass |
TestCallDepthConnection/log.Default.Panic |
pass | pass |
TestCallDepthConnection/log.Default.Panicf |
pass | pass |
TestCallDepthConnection/log.Default.Panicln |
pass | pass |
TestCallDepthConnection/log.Fatal |
pass | pass |
TestCallDepthConnection/log.Fatalf |
pass | pass |
TestCallDepthConnection/log.Fatalln |
pass | pass |
TestCallDepthConnection/log.Output |
pass | pass |
TestCallDepthConnection/log.Panic |
pass | pass |
TestCallDepthConnection/log.Panicf |
pass | pass |
TestCallDepthConnection/log.Panicln |
pass | pass |
TestConcurrentWrites |
pass | pass |
TestConcurrentWrites/json |
pass | pass |
TestConcurrentWrites/text |
pass | pass |
TestConnections |
pass | pass |
TestConnections/wrap_default_handler |
pass | pass |
TestContext |
pass | pass |
TestDefaultHandle |
pass | pass |
TestDefaultHandle/attrs |
pass | pass |
TestDefaultHandle/group |
pass | pass |
TestDefaultHandle/groups |
pass | pass |
TestDefaultHandle/no_attrs |
pass | pass |
TestDefaultHandle/preformatted |
pass | pass |
TestDefaultHandle/preformatted_groups |
pass | pass |
TestDefaultHandle/two_with-groups |
pass | pass |
TestDiscardHandler |
pass | pass |
TestEmptyGroup |
pass | pass |
TestHandlerEnabled |
pass | pass |
TestJSONAllocs |
pass | fail (disclosed) |
TestJSONAllocs/attrs |
pass | fail (disclosed) |
TestJSONAllocs/message |
pass | fail (disclosed) |
TestJSONAndTextHandlers |
pass | pass |
TestJSONAndTextHandlers/GroupValue_as_Attr_value |
pass | pass |
TestJSONAndTextHandlers/GroupValue_as_Attr_value/json |
pass | pass |
TestJSONAndTextHandlers/GroupValue_as_Attr_value/text |
pass | pass |
TestJSONAndTextHandlers/LogValuer |
pass | pass |
TestJSONAndTextHandlers/LogValuer/json |
pass | pass |
TestJSONAndTextHandlers/LogValuer/text |
pass | pass |
TestJSONAndTextHandlers/Source |
pass | pass |
TestJSONAndTextHandlers/Source/json |
pass | pass |
TestJSONAndTextHandlers/Source/text |
pass | pass |
TestJSONAndTextHandlers/basic |
pass | pass |
TestJSONAndTextHandlers/basic/json |
pass | pass |
TestJSONAndTextHandlers/basic/text |
pass | pass |
TestJSONAndTextHandlers/byte_slice |
pass | pass |
TestJSONAndTextHandlers/byte_slice/json |
pass | pass |
TestJSONAndTextHandlers/byte_slice/text |
pass | pass |
TestJSONAndTextHandlers/cap_keys |
pass | pass |
TestJSONAndTextHandlers/cap_keys/json |
pass | pass |
TestJSONAndTextHandlers/cap_keys/text |
pass | pass |
TestJSONAndTextHandlers/empty_group |
pass | pass |
TestJSONAndTextHandlers/empty_group/json |
pass | pass |
TestJSONAndTextHandlers/empty_group/text |
pass | pass |
TestJSONAndTextHandlers/empty_key |
pass | pass |
TestJSONAndTextHandlers/empty_key/json |
pass | pass |
TestJSONAndTextHandlers/empty_key/text |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups,_no_non-empty_attrs |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups,_no_non-empty_attrs/json |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups,_no_non-empty_attrs/text |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups/json |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups/text |
pass | pass |
TestJSONAndTextHandlers/escapes |
pass | pass |
TestJSONAndTextHandlers/escapes/json |
pass | pass |
TestJSONAndTextHandlers/escapes/text |
pass | pass |
TestJSONAndTextHandlers/group_and_key_(or_both)_needs_quoting |
pass | pass |
TestJSONAndTextHandlers/group_and_key_(or_both)_needs_quoting/json |
pass | pass |
TestJSONAndTextHandlers/group_and_key_(or_both)_needs_quoting/text |
pass | pass |
TestJSONAndTextHandlers/groups |
pass | pass |
TestJSONAndTextHandlers/groups/json |
pass | pass |
TestJSONAndTextHandlers/groups/text |
pass | pass |
TestJSONAndTextHandlers/inline_group |
pass | pass |
TestJSONAndTextHandlers/inline_group/json |
pass | pass |
TestJSONAndTextHandlers/inline_group/text |
pass | pass |
TestJSONAndTextHandlers/json.RawMessage |
pass | pass |
TestJSONAndTextHandlers/json.RawMessage/json |
pass | pass |
TestJSONAndTextHandlers/json.RawMessage/text |
pass | pass |
TestJSONAndTextHandlers/nested_empty_group |
pass | pass |
TestJSONAndTextHandlers/nested_empty_group/json |
pass | pass |
TestJSONAndTextHandlers/nested_empty_group/text |
pass | pass |
TestJSONAndTextHandlers/nested_non-empty_group |
pass | pass |
TestJSONAndTextHandlers/nested_non-empty_group/json |
pass | pass |
TestJSONAndTextHandlers/nested_non-empty_group/text |
pass | pass |
TestJSONAndTextHandlers/one_empty_with-group |
pass | pass |
TestJSONAndTextHandlers/one_empty_with-group/json |
pass | pass |
TestJSONAndTextHandlers/one_empty_with-group/text |
pass | pass |
TestJSONAndTextHandlers/preformatted |
pass | pass |
TestJSONAndTextHandlers/preformatted/json |
pass | pass |
TestJSONAndTextHandlers/preformatted/text |
pass | pass |
TestJSONAndTextHandlers/preformatted_cap_keys |
pass | pass |
TestJSONAndTextHandlers/preformatted_cap_keys/json |
pass | pass |
TestJSONAndTextHandlers/preformatted_cap_keys/text |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_all |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_all/json |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_all/text |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_built-in |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_built-in/json |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_built-in/text |
pass | pass |
TestJSONAndTextHandlers/preformatted_with-groups |
pass | pass |
TestJSONAndTextHandlers/preformatted_with-groups/json |
pass | pass |
TestJSONAndTextHandlers/preformatted_with-groups/text |
pass | pass |
TestJSONAndTextHandlers/remove_all |
pass | pass |
TestJSONAndTextHandlers/remove_all/json |
pass | pass |
TestJSONAndTextHandlers/remove_all/text |
pass | pass |
TestJSONAndTextHandlers/remove_built-in |
pass | pass |
TestJSONAndTextHandlers/remove_built-in/json |
pass | pass |
TestJSONAndTextHandlers/remove_built-in/text |
pass | pass |
TestJSONAndTextHandlers/replace_built-in_with_group |
pass | pass |
TestJSONAndTextHandlers/replace_built-in_with_group/json |
pass | pass |
TestJSONAndTextHandlers/replace_built-in_with_group/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty |
pass | pass |
TestJSONAndTextHandlers/replace_empty/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty_1 |
pass | pass |
TestJSONAndTextHandlers/replace_empty_1/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty_1/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty_2 |
pass | pass |
TestJSONAndTextHandlers/replace_empty_2/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty_2/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty_3 |
pass | pass |
TestJSONAndTextHandlers/replace_empty_3/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty_3/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty_inline |
pass | pass |
TestJSONAndTextHandlers/replace_empty_inline/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty_inline/text |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_1 |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_1/json |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_1/text |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_2 |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_2/json |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_2/text |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_3 |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_3/json |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_3/text |
pass | pass |
TestJSONAndTextHandlers/replace_resolved_group |
pass | pass |
TestJSONAndTextHandlers/replace_resolved_group/json |
pass | pass |
TestJSONAndTextHandlers/replace_resolved_group/text |
pass | pass |
TestJSONAndTextHandlers/resolve |
pass | pass |
TestJSONAndTextHandlers/resolve/json |
pass | pass |
TestJSONAndTextHandlers/resolve/text |
pass | pass |
TestJSONAndTextHandlers/two_with-groups |
pass | pass |
TestJSONAndTextHandlers/two_with-groups/json |
pass | pass |
TestJSONAndTextHandlers/two_with-groups/text |
pass | pass |
TestJSONAndTextHandlers/with-group |
pass | pass |
TestJSONAndTextHandlers/with-group/json |
pass | pass |
TestJSONAndTextHandlers/with-group/text |
pass | pass |
TestJSONAndTextHandlersWithUnavailableSource |
pass | pass |
TestJSONAndTextHandlersWithUnavailableSource/json |
pass | pass |
TestJSONAndTextHandlersWithUnavailableSource/text |
pass | pass |
TestJSONAppendAttrValueSpecial |
pass | pass |
TestJSONHandler |
pass | pass |
TestJSONHandler/none |
pass | pass |
TestJSONHandler/replace |
pass | pass |
TestKindString |
pass | pass |
TestLevelAppendText |
pass | pass |
TestLevelFlag |
pass | pass |
TestLevelMarshalJSON |
pass | pass |
TestLevelMarshalText |
pass | pass |
TestLevelParse |
pass | pass |
TestLevelParseError |
pass | pass |
TestLevelString |
pass | pass |
TestLevelVar |
pass | pass |
TestLevelVarAppendText |
pass | pass |
TestLevelVarFlag |
pass | pass |
TestLevelVarMarshalText |
pass | pass |
TestLevelVarString |
pass | pass |
TestLogLoggerLevelForDefaultHandler |
pass | pass |
TestLogLoggerLevelForHandlerWriter |
pass | pass |
TestLogTextHandler |
pass | pass |
TestLogValue |
pass | pass |
TestLoggerError |
pass | pass |
TestLoggerNoOps |
pass | pass |
TestMultiHandler |
pass | pass |
TestMultiHandler/Enabled_returns_false_if_no_handlers_are_enabled |
pass | pass |
TestMultiHandler/Enabled_returns_true_if_any_handler_is_enabled |
pass | pass |
TestMultiHandler/Handle_propagates_errors_from_handlers |
pass | pass |
TestMultiHandler/Handle_sends_log_to_all_handlers |
pass | pass |
TestMultiHandler/Handle_with_no_handlers |
pass | pass |
TestMultiHandler/WithAttrs_propagates_attributes_to_all_handlers |
pass | pass |
TestMultiHandler/WithGroup_propagates_group_to_all_handlers |
pass | pass |
TestNeedsQuoting |
pass | pass |
TestNewLogLogger |
pass | pass |
TestNewMultiHandlerCopy |
pass | pass |
TestPanics |
pass | pass |
TestRecordAttrs |
pass | pass |
TestRecordSource |
pass | pass |
TestReplaceAttrGroups |
pass | pass |
TestSecondWith |
pass | pass |
TestSetAttrs |
pass | pass |
TestSetDefault |
pass | pass |
TestSlogtest |
pass | pass |
TestSlogtest/JSON |
pass | pass |
TestSlogtest/Text |
pass | pass |
TestTextHandler |
pass | pass |
TestTextHandler/String_method |
pass | pass |
TestTextHandler/String_method/none |
pass | pass |
TestTextHandler/String_method/replace |
pass | pass |
TestTextHandler/TextMarshaler |
pass | pass |
TestTextHandler/TextMarshaler/none |
pass | pass |
TestTextHandler/TextMarshaler/replace |
pass | pass |
TestTextHandler/TextMarshaler_error |
pass | pass |
TestTextHandler/TextMarshaler_error/none |
pass | pass |
TestTextHandler/TextMarshaler_error/replace |
pass | pass |
TestTextHandler/nil_value |
pass | pass |
TestTextHandler/nil_value/none |
pass | pass |
TestTextHandler/nil_value/replace |
pass | pass |
TestTextHandler/quoted |
pass | pass |
TestTextHandler/quoted/none |
pass | pass |
TestTextHandler/quoted/replace |
pass | pass |
TestTextHandler/struct |
pass | pass |
TestTextHandler/struct/none |
pass | pass |
TestTextHandler/struct/replace |
pass | pass |
TestTextHandler/unquoted |
pass | pass |
TestTextHandler/unquoted/none |
pass | pass |
TestTextHandler/unquoted/replace |
pass | pass |
TestTextHandlerAlloc |
pass | fail (disclosed) |
TestTextHandlerPreformatted |
pass | pass |
TestValueAny |
pass | pass |
TestValueEqual |
pass | pass |
TestValueNoAlloc |
pass | fail (disclosed) |
TestValueString |
pass | pass |
TestValueTime |
pass | pass |
TestWriteTimeRFC3339 |
pass | pass |
Disclosed divergences
A disclosed divergence is a specific Go assertion this conversion does not satisfy — not
a skipped test and not a tolerance. Each one is pinned by exact failure signature in the package’s
hand-owned go2cs_test_disclosures.json;
a disclosed test that fails any other way is still a hard mismatch.
The Class column says which kind each one is: a deferred entry is an assertion the managed
CLR can meet, pinned against the named plan that will retire it; every other class is one it
provably cannot satisfy.
| Test | Class | Pinned reason |
|---|---|---|
TestAlloc |
aggregate |
no failure text of its own — the roll-up of this test’s disclosed subtests |
TestAlloc/2_pairs |
deferred |
wantAllocs assert with a nonzero Go budget (exactly 2) on Logger.Info with two key/value pairs. At go1.24.13 the converted call counted 10 golib-runtime objects per run: three copies of the ...any parameter pack, the local pcs array runtime.Callers writes into, Record.front, two zero-length Value arrays (log/slog/value.cs:24), the two call-site key literals materialized per call, and StringValue’s element reference through unsafe.StringData. At go1.26.10 the test body changed and it reads 6 per run on windows and linux. CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/2_pairs_disabled_inline |
deferred |
wantAllocs(t, 0, …) over Logger.Log at LevelInfo with two key/value pairs, on a Logger over DiscardHandler, so the level check fails and nothing is formatted. go1.24.13 asserted wantAllocs(t, 2, …) here and the converted side met it; go1.26.10 tightened the budget to 0, and the converted side still counts 2 per run on both OSes. Its parent TestAlloc discloses as aggregate, with no entry of its own (plan §6). |
TestAlloc/9_kvs |
deferred |
wantAllocs assert with a nonzero Go budget (exactly 10) on Logger.Info with nine key/value pairs. At go1.24.13 the converted call counted 27 golib-runtime objects per run: three copies of the ...any parameter pack, the local pcs array runtime.Callers writes into, Record.front, the Record.back slice (one of Go’s own 10), nine zero-length Value arrays (log/slog/value.cs:24), nine call-site key literals materialized per call, and three StringValue element references through unsafe.StringData. At go1.26.10 the test body changed and it reads 16 per run on windows and linux. CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/Error |
deferred |
wantAllocs assert (want 0) on slog.Error(“hello”) through a discarding logger: Go allocates nothing. The converted call counts 2 golib-runtime objects per run that Go keeps off the heap: the local pcs array runtime.Callers writes into (log/slog/logger.cs:293/:315) and Record.front, a fixed array of managed elements (log/slog/record.cs:38). CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/Info |
deferred |
wantAllocs assert (want 0) on slog.Info(“hello”) through a discarding logger: Go allocates nothing. The converted call counts 2 golib-runtime objects per run that Go keeps off the heap: the local pcs array runtime.Callers writes into (log/slog/logger.cs:293/:315) and Record.front, a fixed array of managed elements (log/slog/record.cs:38). CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/attrs1 |
deferred |
wantAllocs assert (want 0) on Logger.LogAttrs with one Attr: Go’s Value packs the payload into its own fields. At go1.24.13 the converted call counted 7 golib-runtime objects per run: three copies of the ...any parameter pack, the local pcs array runtime.Callers writes into, Record.front, the zero-length array the Value constructor initializes (log/slog/value.cs:24), and the call-site key literal materialized per call. At go1.26.10 the test body changed and it reads 4 per run on windows and linux. CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/attrs3 |
deferred |
wantAllocs assert (want 0) on Logger.LogAttrs with three Attrs. At go1.24.13 the converted call counted 12 golib-runtime objects per run: three copies of the ...any parameter pack, the local pcs array runtime.Callers writes into, Record.front, three zero-length Value arrays (log/slog/value.cs:24), three call-site key literals materialized per call, and StringValue’s element reference through unsafe.StringData. At go1.26.10 the test body changed and it reads 7 per run on windows and linux. CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/attrs3_disabled |
deferred |
wantAllocs assert (want 0) on a level-disabled Logger.LogAttrs with three Attrs: the Attrs are constructed before the level check discards them. At go1.24.13 the converted call counted 9 golib-runtime objects per run: two copies of the parameter pack, three zero-length Value arrays (log/slog/value.cs:24), three call-site key literals materialized per call, and StringValue’s element reference through unsafe.StringData. At go1.26.10 the test body changed and it reads 4 per run on windows and linux. CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/attrs6 |
deferred |
wantAllocs assert with a nonzero Go budget (exactly 1) on Logger.LogAttrs with six Attrs. At go1.24.13 the converted call counted 21 golib-runtime objects per run: three copies of the ...any parameter pack, the local pcs array runtime.Callers writes into, Record.front, six zero-length Value arrays (log/slog/value.cs:24), six call-site key literals materialized per call, two StringValue element references through unsafe.StringData, and two from slices.Grow’s make plus append (slices.cs:441). At go1.26.10 the test body changed and it reads 12 per run on windows and linux. CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/attrs9 |
deferred |
wantAllocs assert with a nonzero Go budget (exactly 1) on Logger.LogAttrs with nine Attrs. At go1.24.13 the converted call counted 28 golib-runtime objects per run: three copies of the ...any parameter pack, the local pcs array runtime.Callers writes into, Record.front, nine zero-length Value arrays (log/slog/value.cs:24), nine call-site key literals materialized per call, three StringValue element references through unsafe.StringData, and two from slices.Grow’s make plus append (slices.cs:441). At go1.26.10 the test body changed and it reads 16 per run on windows and linux. CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/logger.Info |
deferred |
wantAllocs assert (want 0) on Logger.Info(“hello”) through a discarding logger: Go allocates nothing. The converted call counts 2 golib-runtime objects per run that Go keeps off the heap: the local pcs array runtime.Callers writes into (log/slog/logger.cs:293/:315) and Record.front, a fixed array of managed elements (log/slog/record.cs:38). CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/logger.Log |
deferred |
wantAllocs assert (want 0) on Logger.Log(ctx, LevelDebug, “hello”) through a discarding logger: Go allocates nothing. The converted call counts 2 golib-runtime objects per run that Go keeps off the heap: the local pcs array runtime.Callers writes into (log/slog/logger.cs:293/:315) and Record.front, a fixed array of managed elements (log/slog/record.cs:38). CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAlloc/pairs |
deferred |
wantAllocs assert (want 0) on Logger.Info(“”, “error”, io.EOF): Go keeps the interface value and the record’s working state off the heap. At go1.24.13 the converted call counted 6 golib-runtime objects per run, three copies of the ...any parameter pack, the local pcs array runtime.Callers writes into, Record.front and the zero-length array a Value constructor initializes (log/slog/value.cs:24); at go1.26.10 the test body changed and it reads 3 per run on windows and linux. CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing the arguments into any is not part of the reading. |
TestAnyLevelAlloc |
deferred |
wantAllocs assert (want 0) on passing a Level through any: Go’s two-word interface value holds it without allocating. At go1.24.13 the counted object was the zero-length array AnyValue’s default arm initializes in the Value (log/slog/value.cs:24). At go1.26.10 golib’s counter charges no object on this path and the measurable figure is bytes, 24 per run on windows and linux: the boxed Level, which golib’s counter does not charge (AllocationCounter.cs:50-53). |
TestAttrNoAlloc |
deferred |
Want-zero AllocsPerRun assert over the Attr constructors: Go’s Value stores the payload inline and allocates nothing. At go1.24.13 the converted path counted 14 golib-runtime objects per run: seven zero-length arrays the explicit Value constructors initialize (log/slog/value.cs:24), one StringValue element reference through unsafe.StringData, and 6 not yet attributed. At go1.26.10 it reads 1 per run on windows and linux (identical test body). CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53). |
TestJSONAllocs |
aggregate |
no failure text of its own — the roll-up of this test’s disclosed subtests |
TestJSONAllocs/attrs |
deferred |
wantAllocs(t, 1, …) over Logger.LogAttrs(ctx, LevelInfo, “hello world”, …) with five attributes – String, Int, Bool, Any over an error, Any over a three-field struct – through a JSONHandler writing to io.Discard; the test is new at go1.26.10. Go budgets exactly one allocation; the converted side counts 28 per run on windows and 26 on linux. |
TestJSONAllocs/message |
deferred |
wantAllocs(t, 0, …) over Logger.LogAttrs(ctx, LevelInfo, “hello world”) with no attributes, through a JSONHandler writing to io.Discard; the test is new at go1.26.10. Go budgets zero allocations; the converted side counts 12 per run on windows and 10 on linux. Its parent TestJSONAllocs discloses as aggregate, with no entry of its own (plan §6). |
TestTextHandlerAlloc |
deferred |
wantAllocs assert (want 0) on TextHandler.Handle: Go’s append-only formatting path allocates nothing. The converted handler counts golib-runtime objects per run, 20 at go1.24.13 and, at go1.26.10, 20 on windows and 19 on linux (identical test body); they are not yet attributed to sites. CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53), so boxing Values is not the cause. |
TestValueNoAlloc |
deferred |
Want-zero AllocsPerRun assert over the Value constructors: Go’s Value stores the payload inline and allocates nothing. At go1.24.13 the converted path counted 15 golib-runtime objects per run: eight zero-length arrays the explicit Value constructors initialize (log/slog/value.cs:24), one StringValue element reference through unsafe.StringData, and 6 not yet attributed. At go1.26.10 it reads 1 per run on windows and linux (identical test body). CLR boxes and interface shells are not counted (AllocationCounter.cs:50-53). |
Excluded declarations
Declarations filtered from both sides of the comparison, and therefore not claimed above:
Benchmark, Fuzz and Example declarations the converted host does not execute, plus any
test requiring a capability the managed runtime does not provide — a testing member the host
has not implemented, or a platform behavior it provably cannot reproduce. Each is named with
the capability it needs.
- BenchmarkAppendKey (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkAttrString (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkDispatch (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkJSONEncoding (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkJSONHandler (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkLevelString (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkNopLog (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkPC (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkPreformatting (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkRecord (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkUnsafeStrings (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkWriteTime (benchmark): benchmark execution is deferred to Phase 4D
- ExampleGroup (example): example execution is deferred to Phase 4D
- ExampleGroupAttrs (example): example execution is deferred to Phase 4D
- ExampleHandlerOptions_customLevels (example): example execution is deferred to Phase 4D
- ExampleHandler_levelHandler (example): example execution is deferred to Phase 4D
- ExampleLogValuer_group (example): example execution is deferred to Phase 4D
- ExampleLogValuer_secret (example): example execution is deferred to Phase 4D
- ExampleMultiHandler (example): example execution is deferred to Phase 4D
- ExampleSetLogLoggerLevel_log (example): example execution is deferred to Phase 4D
- ExampleSetLogLoggerLevel_slog (example): example execution is deferred to Phase 4D
- Example_discardHandler (example): example execution is deferred to Phase 4D
- Example_wrapping (example): example execution is deferred to Phase 4D