diff --git a/src/Compilers/CSharp/Portable/Lowering/MethodToClassRewriter.cs b/src/Compilers/CSharp/Portable/Lowering/MethodToClassRewriter.cs index e31b70a51ca7a2356d38e1077e954684fa1e7930..1a79d0bae99b4f1a029344ab88e7d7934e22a68f 100644 --- a/src/Compilers/CSharp/Portable/Lowering/MethodToClassRewriter.cs +++ b/src/Compilers/CSharp/Portable/Lowering/MethodToClassRewriter.cs @@ -558,6 +558,33 @@ private PropertySymbol VisitPropertySymbol(PropertySymbol property) throw ExceptionUtilities.Unreachable; } + private FieldSymbol VisitFieldSymbol(FieldSymbol field) + { + // Property of a regular type + return ((FieldSymbol)field.OriginalDefinition) + .AsMember((NamedTypeSymbol)TypeMap.SubstituteType(field.ContainingType)); + } + + public override BoundNode VisitObjectInitializerMember(BoundObjectInitializerMember node) + { + ImmutableArray arguments = (ImmutableArray)this.VisitList(node.Arguments); + TypeSymbol type = this.VisitType(node.Type); + + var member = node.MemberSymbol; + + switch (member.Kind) + { + case SymbolKind.Field: + member = VisitFieldSymbol((FieldSymbol)member); + break; + case SymbolKind.Property: + member = VisitPropertySymbol((PropertySymbol)member); + break; + } + + return node.Update(member, arguments, node.ArgumentNamesOpt, node.ArgumentRefKindsOpt, node.Expanded, node.ArgsToParamsOpt, node.ResultKind, type); + } + private static bool BaseReferenceInReceiverWasRewritten(BoundExpression originalReceiver, BoundExpression rewrittenReceiver) { return originalReceiver != null && originalReceiver.Kind == BoundKind.BaseReference && diff --git a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenExprLambdaTests.cs b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenExprLambdaTests.cs index f58255e3bab10c7a0052518b299bc981649d3f94..5b4c6bc99226690deae52ddb96345f7fdda3659d 100644 --- a/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenExprLambdaTests.cs +++ b/src/Compilers/CSharp/Test/Emit/CodeGen/CodeGenExprLambdaTests.cs @@ -2586,6 +2586,84 @@ public static void Main() new[] { ExpressionAssemblyRef }, expectedOutput: TrimExpectedOutput(expectedOutput)); } + [WorkItem(3906, "https://github.com/dotnet/roslyn/issues/3906")] + [Fact] + public void GenericField01() + { + var text = +@" +using System; + +public class M +{ + + public class S + { + public T x; + } + + public static object SomeFunc(System.Linq.Expressions.Expression> selector) + { return null; } + + public static void CallIt(T t) + { + Func goodF = xs => SomeFunc>(e => new S()); + var z1 = goodF(3); + + Func badF = xs => SomeFunc>(e => new S { x = t }); + var z2 = badF(3); + } + + public static void Main() + { + CallIt(3); + } +} +"; + CompileAndVerify( + new[] { text, ExpressionTestLibrary }, + new[] { ExpressionAssemblyRef }, expectedOutput: ""); + } + + [WorkItem(3906, "https://github.com/dotnet/roslyn/issues/3906")] + [Fact] + public void GenericProperty01() + { + var text = +@" +using System; + +public class M +{ + + public class S + { + public T x{get; set;} + } + + public static object SomeFunc(System.Linq.Expressions.Expression> selector) + { return null; } + + public static void CallIt(T t) + { + Func goodF = xs => SomeFunc>(e => new S()); + var z1 = goodF(3); + + Func badF = xs => SomeFunc>(e => new S { x = t }); + var z2 = badF(3); + } + + public static void Main() + { + CallIt(3); + } +} +"; + CompileAndVerify( + new[] { text, ExpressionTestLibrary }, + new[] { ExpressionAssemblyRef }, expectedOutput: ""); + } + [WorkItem(544304, "DevDiv")] [Fact] public void CheckedEnumAddition() diff --git a/src/Compilers/VisualBasic/Test/Emit/ExpressionTrees/CodeGenExprLambda.vb b/src/Compilers/VisualBasic/Test/Emit/ExpressionTrees/CodeGenExprLambda.vb index a800f2b129bd1cb80b3c34d39cdadbb1404a46ce..1f7005c3d34d24d6f7747c8ae1c37663c5fb5d5e 100644 --- a/src/Compilers/VisualBasic/Test/Emit/ExpressionTrees/CodeGenExprLambda.vb +++ b/src/Compilers/VisualBasic/Test/Emit/ExpressionTrees/CodeGenExprLambda.vb @@ -6805,6 +6805,46 @@ end class expectedOutput:="m => m").VerifyDiagnostics() End Sub + + + + Public Sub GenericField01() + Dim source = + + + + CompileAndVerify(source, + additionalRefs:={SystemCoreRef}, + expectedOutput:="").VerifyDiagnostics() + End Sub + Public Sub ExpressionTrees_MyBaseMyClass() Dim file =