Repository navigation
Preserve definite assignment across short-circuit outcomes - #9944
richlander wants to merge 6 commits into
Conversation
Round 1 candidate lock
Generated by Codex. |
Round 1 adversarial review dispatched
Generated by Codex. |
Round 1 reconciliationCLEAN at locked head The reviewer verified the outcome-specific verified-out facts and conservative Prior obligations and limitations remain explicit:
At 2026-10-11 00:43:44 UTC, a fresh whole-PR snapshot confirmed unchanged head Round start: 2026-10-11 00:24:54 UTC. Round end: 2026-10-11 00:43:44 UTC. Generated by Codex. |
Preserve primitive-boolean outcome assignment facts
8d72a548de2c8f525ba5bddbbbd66ff1a9c78bd8.1f729e607396d376eca918a56c8a8d007071782b(clean source head; the final commit only records that generated baseline).Change
Conclusion: REVIEW — scoped native fidelity improves; the full-corpus raw validity gate remains BLOCKED under #9939. Four sampled rows become Exact without availability losses. No whole-corpus legality or merge-readiness claim is made. The raw validity-shell failure remains visible under #9939 and full Render A/B acquisition is limited by #9935.
Evidence map
Shared judgment
Raise contract
Normative owner:
docs/design/value-typed-emission.md#instance-3--definite-assignment-decided-before-printing— emit a bare local only when every path reaching its read establishes definite assignment before printing.Supporting roles:
MethodRef.TryGetVerifiedOutLocalsupplies metadata-derived out facts; ShortCircuitFidelity supplies the user-truthiness decline constraint; the correctness pipeline separates legality, correctness, and native fidelity; CSharpPrinter consumes the existing decided initializer set across CLI and Browser paths.Correctness-fix contract
Structural review
Scope: one pinned DisplayName MethodDef. Required exact CLI document acquisition and structural review completed at base d93cb58 / head 8d72a54.
Attempted — unavailable for the claimed change: generated result is
No structural changes.The emitted initializer has no supported changed structural row. Standalone before/after bodies are retained; no caller-authored correspondence or carets are substituted.PDB Source → After
Benchmark target
Package
dotnet-inspect.any0.14.0, tools/net10.0/any/ILInspector.Decompiler.dll.dotnet-inspect member ILInspector.Decompiler.Pipeline.TypeRef \ --library /home/rich/.nuget/packages/dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll \ -m DisplayName --all -S "Decompiled Source"Before
d93cb58f8b5c44ecc831158db64cee502a7e63e6.After
8d72a548de2c8f525ba5bddbbbd66ff1a9c78bd8.Fully raised
The After decompilation is in the fully raised state.
Evidence
The nine matched base failures are only the new scoped regression cases: positive AND/OR outcomes, nested AND, host half of nested-body isolation, returning guard, conditional expression, compiler-produced no-default and native Exact cases, and pinned DisplayName. Their negatives remain green. The fast lane excludes the slow native compiler-produced Exact case, leaving eight expected failures at base. Known main failures #9504 and #9875 are outside this fast lane and are not claimed fixed.
The temporary truthiness-probe assembly and durable test-host truthiness fixture are distinct compiler-produced witnesses, not the same physical input. #9940 owns their separate pre-existing guard-folding fidelity defect; this slice preserves legality by declining its outcome facts.
Corpus validity
Conclusion: BLOCKED for the raw validity lane — Render A/B reports 57 new CS0165 cases. #9939 proves the witness is a dependent diagnostic from missing receiver/callee context. Native RTS independently proves 24 of those 57 compilable (17 Exact gains, 7 retained OpcodeDiff); the other 33 remain RecompileFail at both revisions. No blanket all-method validity claim is made.
Scope: fixed 13-assembly A/B population; 139 changed methods. Raw generated transitions: 59 valid→valid, 0 invalid→valid, 57 valid→invalid, 23 invalid→invalid. These raw labels include the harness's binding/coverage limitations and remain unmodified. The full 14-assembly acquisition failure is #9935; Microsoft.CodeAnalysis.CSharp is excluded only from this A/B population, not native reference closure or full-corpus capture.
The full capture separately reports 40 raw valid→CS0165 rows: 15 native Exact gains, 7 retained OpcodeDiff, and 18 unchanged RecompileFail. Native proves only 22 compilable. Complete 40-row ledger; refreshed native attribution including both CSharp rows.
Complete per-method spelling, raw validity, and native status ledger: #9929 (comment). Refreshed exact-base/head documents have identical 139 identities and byte pairs; the native rerun at the refreshed pair gives the same transitions.
Decompiler quality
Conclusion: BLOCKED for the raw validity gate — native fidelity improves, while the untouched validity shell reports 40 new CS0165 rows. The regenerated baseline records both facts. No tolerance, oracle, or comparator change masks the failing gate.
Scope: 14 pinned assemblies, 89,065 methods, 25,354 validity checks, and 682 independently selected fidelity targets. Clean base
d93cb58f8reproduces main's committed baseline on every method row and metric. Clean source head1f729e607differs on exactly 43 methods: 40 validity transitions and four native/legacy OpcodeDiff→Exact transitions, with one overlap. Their identities and attribution match the preceding pair before #9914. The final8d72a548dcommit only installs this generated baseline.The four native Exact gains are
ILInspector.Analysis.TypeRef::ArityOf,ILInspector.Decompiler.Pipeline.TypeRef::DisplayName, andILInspector.Metadata.TypeResolver::{ApplyGenericArguments,FormatDisplayName}(both in MetadataPrimitives.dll). The five #9914 availability gains are already present at base and are not attributed to this slice. Full malformed stays 1; pass bugs stay 8; availability and all cutover pins remain unchanged.The generated “Fully raised” quality row is the validity-qualified population and falls by 40 with the raw CS0165 labels. The all-method
fullyRaisedflag count stays 78,952. These are different metrics; neither substitutes for the other.Matched quick census
The standard PR quick preparation selects 19 assemblies, capped at 100 methods each, yielding 1,716 methods. Both products inspect the same prepared physical binaries and paths from the same working directory. This is a matched source-build input population, separate from the 14-assembly pinned real-world corpus and from the committed quick manifest. Compile/fidelity caps are zero, so this lane gives no legality or fidelity verdict. It reports zero changed rows and identical metrics.
Full-corpus generated card
Decompiler quality diff
Input
1f729e607396d376eca918a56c8a8d007071782b(clean)nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/DotnetInspector.Core.dll@362d6e0b-0ce7-4fad-b3c5-fa0efdd2ba29nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/DotnetInspector.Packages.dll@69e682d2-be56-4acc-8dba-916ceab1291fnuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/DotnetInspector.Services.dll@a72489e5-3025-490b-bb65-85c3d994e299nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Analysis.dll@9975f197-525d-47a9-b01a-4a70417ddf49nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Decompiler.dll@eed37876-108a-4357-8a37-04b7b8c7c80anuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.Metadata.dll@fe800527-5802-493c-8bcb-f25dd7b52fe4nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/ILInspector.MetadataPrimitives.dll@4d3d5a39-db35-4ca1-a2db-a917dbed66a6nuget:dotnet-inspect.any/0.14.0/tools/net10.0/any/dotnet-inspect.dll@25685158-507c-4a08-8fd6-356dde6bfc5bnuget:microsoft.applicationinsights/2.23.0/lib/netstandard2.0/Microsoft.ApplicationInsights.dll@bcf1683b-7056-470d-acdf-320c98769a42nuget:microsoft.codeanalysis.common/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.dll@bc961ed5-3be6-478b-adaf-34d3f75b70ecnuget:microsoft.codeanalysis.csharp/5.0.0/lib/net9.0/Microsoft.CodeAnalysis.CSharp.dll@a39e195a-baba-49cd-a757-3f6c39a6df15nuget:newtonsoft.json/13.0.4/lib/net6.0/Newtonsoft.Json.dll@00b3a5ef-dbc3-4c2f-9c39-8fe4911d40e8nuget:nuget.versioning/7.3.0/lib/net8.0/NuGet.Versioning.dll@190ca792-bfd7-4581-af2f-0d95522d4759nuget:system.commandline/3.0.0-preview.5.26302.115/lib/net10.0/System.CommandLine.dll@e5447a43-dc39-4096-8c93-68b4cdab5332Analysis
Pinned-subset gate (PR quick rate/count regressions evaluated here): detected lowering residue 11.35% -> 11.35% (0 pp); conditional-branch residue 2.85% -> 2.85% (0 pp); Full malformed 1 -> 1 (0); semantic defects 217 -> 257 (+40); opcode diffs 67 -> 63 (-4).
Regressions:
2<System.Collections.Immutable:System.Collections.Immutable.ImmutableArray1Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Diagnostics.SymbolEndAnalyzerAction, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Diagnostics.SymbolDeclaredCompilationEvent>) -> corelib:System.Boolean -> semantic-defect:CS01651<Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.CodeGen.DebugId>, ref Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.CodeGen.DebugId, ref corelib:System.Nullable1Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.Emit.RuntimeRudeEdit) -> corelib:System.Boolean -> semantic-defect:CS01651<Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree>, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree, corelib:System.Collections.Generic.IDictionary2<Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree, corelib:System.Int32>, System.Collections.Immutable:System.Collections.Immutable.ImmutableDictionary2<Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree, System.Collections.Immutable:System.Collections.Immutable.ImmutableArray1Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.LoadDirective>, System.Collections.Immutable:System.Collections.Immutable.ImmutableDictionary`2<corelib:System.String, Microsoft.CodeAnalysis:Microsoft.CodeAnalysis.SyntaxTree>) -> corelib:System.Void -> semantic-defect:CS0165Per-method delta artifact:
/home/rich/.cache/rts-row-triage/corpus-delta-d93cb58f8-1f729e607.jsonNo contract/comparator changes, no compile-back floor, and no ReturnToSender or validity-harness edits are included. The artifact.Source dump used for triage was temporary and removed before the first product commit. The temporary probes invoke existing APIs without repairing product source. Keep source-build fixture growth separate from the fixed corpus.
Validation
Generated by Codex.