Commit Graph
5 Commits
Author SHA1 Message Date
upstream a6526a1dab Upstream icsharpcode/ILSpy state of the touched files before 1e0fba1611 2026-10-03 11:46:13 +02:00
dualfroz 3b5201cabc Fix #4153: Keep foreach when a named argument reads the loop variable
Once a named argument is hoisted, the call becomes a CallWithNamedArgs
block, and inlining moves the Current getter into the block's first
argument store. The foreach detection could not move it back out:
CanInlineIntoSlot refused the block, and for an instance call the store
of the 'this' argument in front counted as a write the getter cannot be
moved past. That store only writes the block's own variable, so the
getter is checked against the stored value instead, the same way
CanExtendNamedArgument allows inlining into that position.
2026-10-03 03:33:10 +02:00
upstream 3e462ad472 Upstream icsharpcode/ILSpy state of the touched files before 3c35e4cef6 2026-10-03 03:33:10 +02:00
dualfroz 167098573c Keep a discarded method-group conversion out of the delegate cache
CachedDelegateInitializationWithField only fired when the instruction
after the caching `if` read the cache field exactly once. A discarded
conversion -- `_ = (Action<int>)M;` -- reads it zero times: Roslyn emits
the null check and the store, and nothing else. The transform bailed out,
so the `<>O` cache class and its `<0>__M` field survived into the output
under names no C# compiler will accept.

Zero usages is now handled: the `if` is replaced by the delegate
construction it guarded, which is what the source expressed, and the
caching disappears with the field. The rest of the method is checked for
loads of the same field first, since only then is this `if` the sole
initialization.

Closes #3965
2026-09-19 11:14:31 +02:00
upstream 80cf67e749 Upstream icsharpcode/ILSpy state of the touched files before 259e513829 2026-09-11 23:42:13 +02:00