Skip to content

Commit

Permalink
Fix #1689: Add support for null propagation on array access: arr?[i]
Browse files Browse the repository at this point in the history
  • Loading branch information
dgrunwald committed Sep 30, 2019
1 parent 80cb24d commit d65b109
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ public void CoalescingString()
{
Use(GetMyClass()?.Text ?? "Hello");
}

public void CallOnValueTypeField()
{
Use(GetMyClass()?.IntVal.ToString());
Expand Down Expand Up @@ -265,6 +265,12 @@ private void Setter(MyClass c)
return (obj as ICollection)?.Count + (obj as ICollection<int>)?.Count;
}

private static void Issue1689(List<byte[]> setsOfNumbers)
{
Console.WriteLine(setsOfNumbers?[0]?[1].ToString() == "2");
Console.WriteLine(setsOfNumbers?[1]?[1].ToString() == null);
}

private static dynamic DynamicNullProp(dynamic a)
{
return a?.b.c(1)?.d[10];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

using System;
using System.Diagnostics;
using System.Linq;
using ICSharpCode.Decompiler.TypeSystem;

namespace ICSharpCode.Decompiler.IL.Transforms
Expand Down Expand Up @@ -211,6 +212,11 @@ bool IsValidAccessChain(ILVariable testedVar, Mode mode, ILInstruction inst, out
return false;
} else if (inst is LdLen ldLen) {
inst = ldLen.Array;
} else if (inst is LdElema ldElema) {
inst = ldElema.Array;
// ensure the access chain does not contain any 'nullable.unwrap' that aren't directly part of the chain
if (ldElema.Indices.Any(i => i.HasFlag(InstructionFlags.MayUnwrapNull)))
return false;
} else if (inst is NullableUnwrap unwrap) {
inst = unwrap.Argument;
if (unwrap.RefInput && inst is AddressOf addressOf) {
Expand Down

0 comments on commit d65b109

Please sign in to comment.