Skip to content

Fix circular init in AOT equality comparer causing NRE on Mono#73

Merged
bradwilson merged 1 commit intoxunit:mainfrom
agocke:fix-circular-init-aot
Mar 20, 2026
Merged

Fix circular init in AOT equality comparer causing NRE on Mono#73
bradwilson merged 1 commit intoxunit:mainfrom
agocke:fix-circular-init-aot

Conversation

@agocke
Copy link
Contributor

@agocke agocke commented Mar 20, 2026

The defaultComparer field in AssertEqualityComparer (AOT path) eagerly creates AssertEqualityComparerAdapter<object>, which triggers AssertEqualityComparer<object>'s static initializer. That initializer reads defaultComparer back via GetDefaultInnerComparer before the field has been assigned. On Mono/WASM this results in DefaultInnerComparer being permanently null, leading to NullReferenceException when comparing value types via IStructuralEquatable.

Fix by creating a new instance on each call, matching the non-AOT reflection path behavior.

Port of dotnet/arcade#16615

The defaultComparer field in AssertEqualityComparer (AOT path) eagerly
creates AssertEqualityComparerAdapter<object>, which triggers
AssertEqualityComparer<object>'s static initializer. That initializer
reads defaultComparer back via GetDefaultInnerComparer before the field
has been assigned. On Mono/WASM this results in DefaultInnerComparer
being permanently null, leading to NullReferenceException when comparing
value types via IStructuralEquatable.

Fix by creating a new instance on each call, matching the non-AOT
reflection path behavior.

Port of dotnet/arcade#16615

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@bradwilson bradwilson merged commit a23d045 into xunit:main Mar 20, 2026
1 check passed
@bradwilson
Copy link
Member

Thanks!

@bradwilson
Copy link
Member

Fix available in v3 3.2.3-pre.17 https://xunit.net/docs/using-ci-builds

@agocke agocke deleted the fix-circular-init-aot branch March 21, 2026 00:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants