k__BackingField""
+ IL_0006: ret
+}
+");
+ }
+
+ [Fact]
+ public void FieldKeyword_02()
+ {
+ var source = @"
+class C
+{
+ public int P
+ {
+ get
+ {
+ return field;
+ }
+ set
+ {
+#line 300
+ _ = value;
+#line 400
+ }
+ }
+}
+";
+
+ var testData = Evaluate(
+ source,
+ OutputKind.DynamicallyLinkedLibrary,
+ methodName: "C.set_P",
+ atLineNumber: 300, debugFormat: DebugInformationFormat.PortablePdb,
+ expr: "field");
+
+ var methodData = testData.GetMethodData("<>x.<>m0");
+
+ Assert.True(methodData.Method.IsStatic);
+ AssertEx.Equal("System.Int32 <>x.<>m0(C <>4__this, System.Int32 value)", ((MethodSymbol)methodData.Method).ToTestDisplayString());
+ methodData.VerifyIL(
+@"
+{
+ // Code size 7 (0x7)
+ .maxstack 1
+ IL_0000: ldarg.0
+ IL_0001: ldfld ""int C.k__BackingField""
+ IL_0006: ret
+}
+");
+ }
+
+ [Fact]
+ public void FieldKeyword_03()
+ {
+ var source = @"
+class C
+{
+ public int P
+ {
+ get
+ {
+ return local();
+
+ int local()
+ {
+#line 100
+ return field;
+#line 200
+ }
+ }
+ set
+ {
+ field = value;
+ }
+ }
+}
+";
+
+ var testData = Evaluate(
+ source,
+ OutputKind.DynamicallyLinkedLibrary,
+ methodName: "C.g__local|2_0",
+ atLineNumber: 100, debugFormat: DebugInformationFormat.PortablePdb,
+ expr: "field");
+
+ var methodData = testData.GetMethodData("<>x.<>m0");
+
+ Assert.True(methodData.Method.IsStatic);
+ AssertEx.Equal("System.Int32 <>x.<>m0(C <>4__this)", ((MethodSymbol)methodData.Method).ToTestDisplayString());
+ methodData.VerifyIL(
+@"
+{
+ // Code size 7 (0x7)
+ .maxstack 1
+ .locals init (int V_0)
+ IL_0000: ldarg.0
+ IL_0001: ldfld ""int C.k__BackingField""
+ IL_0006: ret
+}
+");
+ }
+
+ [Fact]
+ public void FieldKeyword_04()
+ {
+ var source = @"
+class C
+{
+ public int P
+ {
+ get
+ {
+ int x = 1;
+ System.Func d = local;
+ return d();
+
+ int local()
+ {
+#line 100
+ return field + x;
+#line 200
+ }
+ }
+ set
+ {
+ field = value;
+ }
+ }
+}
+";
+
+ var testData = Evaluate(
+ source,
+ OutputKind.DynamicallyLinkedLibrary,
+ methodName: "C.<>c__DisplayClass2_0.g__local|0",
+ atLineNumber: 100, debugFormat: DebugInformationFormat.PortablePdb,
+ expr: "field");
+
+ var methodData = testData.GetMethodData("<>x.<>m0");
+
+ Assert.True(methodData.Method.IsStatic);
+ AssertEx.Equal("System.Int32 <>x.<>m0(C.<>c__DisplayClass2_0 <>4__this)", ((MethodSymbol)methodData.Method).ToTestDisplayString());
+ methodData.VerifyIL(
+@"
+{
+ // Code size 12 (0xc)
+ .maxstack 1
+ .locals init (int V_0)
+ IL_0000: ldarg.0
+ IL_0001: ldfld ""C C.<>c__DisplayClass2_0.<>4__this""
+ IL_0006: ldfld ""int C.k__BackingField""
+ IL_000b: ret
+}
+");
+ }
+
+ [Fact]
+ public void FieldKeyword_05()
+ {
+ var source = @"
+class C
+{
+ public int P
+ {
+ get
+ {
+ System.Func d = int () =>
+ {
+#line 100
+ return field;
+#line 200
+ };
+
+ return d();
+ }
+ set
+ {
+ field = value;
+ }
+ }
+}
+";
+
+ var testData = Evaluate(
+ source,
+ OutputKind.DynamicallyLinkedLibrary,
+ methodName: "C.b__2_0",
+ atLineNumber: 100, debugFormat: DebugInformationFormat.PortablePdb,
+ expr: "field");
+
+ var methodData = testData.GetMethodData("<>x.<>m0");
+
+ Assert.True(methodData.Method.IsStatic);
+ AssertEx.Equal("System.Int32 <>x.<>m0(C <>4__this)", ((MethodSymbol)methodData.Method).ToTestDisplayString());
+ methodData.VerifyIL(
+@"
+{
+ // Code size 7 (0x7)
+ .maxstack 1
+ .locals init (int V_0)
+ IL_0000: ldarg.0
+ IL_0001: ldfld ""int C.k__BackingField""
+ IL_0006: ret
+}
+");
+ }
+
+ [Fact]
+ public void FieldKeyword_06()
+ {
+ var source = @"
+class C
+{
+ public int P
+ {
+ get
+ {
+ int x = 1;
+
+ System.Func d = int () =>
+ {
+#line 100
+ return field + x;
+#line 200
+ };
+
+ return d();
+ }
+ set
+ {
+ field = value;
+ }
+ }
+}
+";
+
+ var testData = Evaluate(
+ source,
+ OutputKind.DynamicallyLinkedLibrary,
+ methodName: "C.<>c__DisplayClass2_0.b__0",
+ atLineNumber: 100, debugFormat: DebugInformationFormat.PortablePdb,
+ expr: "field");
+
+ var methodData = testData.GetMethodData("<>x.<>m0");
+
+ Assert.True(methodData.Method.IsStatic);
+ AssertEx.Equal("System.Int32 <>x.<>m0(C.<>c__DisplayClass2_0 <>4__this)", ((MethodSymbol)methodData.Method).ToTestDisplayString());
+ methodData.VerifyIL(
+@"
+{
+ // Code size 12 (0xc)
+ .maxstack 1
+ .locals init (int V_0)
+ IL_0000: ldarg.0
+ IL_0001: ldfld ""C C.<>c__DisplayClass2_0.<>4__this""
+ IL_0006: ldfld ""int C.k__BackingField""
+ IL_000b: ret
+}
+");
+ }
+
+ [Fact]
+ public void FieldKeyword_07()
+ {
+ var source = @"
+class C
+{
+ public System.Collections.Generic.IEnumerable P
+ {
+ get
+ {
+ foreach (var i in field)
+ {
+#line 100
+ yield return i;
+#line 200
+ }
+ }
+ } = [];
+}
+";
+
+ var testData = Evaluate(
+ source,
+ OutputKind.DynamicallyLinkedLibrary,
+ methodName: "C.d__2.MoveNext",
+ atLineNumber: 100, debugFormat: DebugInformationFormat.PortablePdb,
+ expr: "field");
+
+ var methodData = testData.GetMethodData("<>x.<>m0");
+
+ Assert.True(methodData.Method.IsStatic);
+ AssertEx.Equal("System.Collections.Generic.IEnumerable <>x.<>m0(C.d__2 <>4__this)", ((MethodSymbol)methodData.Method).ToTestDisplayString());
+ methodData.VerifyIL(
+@"
+{
+ // Code size 12 (0xc)
+ .maxstack 1
+ .locals init (bool V_0,
+ int V_1)
+ IL_0000: ldarg.0
+ IL_0001: ldfld ""C C.d__2.<>4__this""
+ IL_0006: ldfld ""System.Collections.Generic.IEnumerable C.k__BackingField""
+ IL_000b: ret
+}
+");
+ }
+
+ [Fact]
+ public void FieldKeyword_08()
+ {
+ var source = @"
+class C
+{
+ public T P2
+ {
+ get
+ {
+#line 100
+ return field;
+#line 200
+ }
+ set
+ {
+ field = value;
+ }
+ }
+}
+";
+
+ var testData = Evaluate(
+ source,
+ OutputKind.DynamicallyLinkedLibrary,
+ methodName: "C.get_P2",
+ atLineNumber: 100, debugFormat: DebugInformationFormat.PortablePdb,
+ expr: "field");
+
+ var methodData = testData.GetMethodData("<>x.<>m0");
+
+ Assert.True(methodData.Method.IsStatic);
+ AssertEx.Equal("T <>x.<>m0(C <>4__this)", ((MethodSymbol)methodData.Method).ToTestDisplayString());
+ methodData.VerifyIL(
+@"
+{
+ // Code size 7 (0x7)
+ .maxstack 1
+ .locals init (T V_0)
+ IL_0000: ldarg.0
+ IL_0001: ldfld ""T C.k__BackingField""
+ IL_0006: ret
+}
+");
+ }
+
+ [Fact]
+ public void FieldKeyword_09()
+ {
+ var source =
+@"
+class C
+{
+ public int P1
+ {
+ get
+ {
+ return field;
+ }
+ set
+ {
+ field = value;
+ }
+ }
+
+ public int P2
+ {
+ get
+ {
+#line 100
+ return field;
+#line 200
+ }
+ set
+ {
+ field = value;
+ }
+ }
+
+ public int P3
+ {
+ get
+ {
+ return field;
+ }
+ set
+ {
+ field = value;
+ }
+ }
+}
+";
+ var compilation0 = CreateCompilation(source, options: TestOptions.UnsafeDebugDll);
+ WithRuntimeInstance(compilation0, runtime =>
+ {
+ var context = CreateMethodContext(runtime, "C.get_P2", atLineNumber: 100);
+ string error;
+ var testData = new CompilationTestData();
+ context.CompileAssignment(
+ target: "field",
+ expr: "field + 1",
+ error: out error,
+ testData: testData);
+ testData.GetMethodData("<>x.<>m0").VerifyIL(
+@"
+{
+ // Code size 15 (0xf)
+ .maxstack 3
+ .locals init (int V_0)
+ IL_0000: ldarg.0
+ IL_0001: ldarg.0
+ IL_0002: ldfld ""int C.k__BackingField""
+ IL_0007: ldc.i4.1
+ IL_0008: add
+ IL_0009: stfld ""int C.k__BackingField""
+ IL_000e: ret
+}
+");
+ });
+ }
+
+ [Fact]
+ public void FieldKeyword_10()
+ {
+ var source = @"
+class C
+{
+ public static int P1
+ {
+ get
+ {
+ return field;
+ }
+ set
+ {
+ field = value;
+ }
+ }
+
+ public static int P2
+ {
+ get
+ {
+#line 100
+ return field;
+#line 200
+ }
+ set
+ {
+ field = value;
+ }
+ }
+
+ public static int P3
+ {
+ get
+ {
+ return field;
+ }
+ set
+ {
+ field = value;
+ }
+ }
+}
+";
+
+ var testData = Evaluate(
+ source,
+ OutputKind.DynamicallyLinkedLibrary,
+ methodName: "C.get_P2",
+ atLineNumber: 100, debugFormat: DebugInformationFormat.PortablePdb,
+ expr: "field");
+
+ var methodData = testData.GetMethodData("<>x.<>m0");
+
+ Assert.True(methodData.Method.IsStatic);
+ AssertEx.Equal("System.Int32 <>x.<>m0()", ((MethodSymbol)methodData.Method).ToTestDisplayString());
+ methodData.VerifyIL(
+@"
+{
+ // Code size 6 (0x6)
+ .maxstack 1
+ .locals init (int V_0)
+ IL_0000: ldsfld ""int C.k__BackingField""
+ IL_0005: ret
+}
+");
+ }
+
+ [Fact]
+ public void FieldKeyword_11()
+ {
+ var source = @"
+class C
+{
+ public static int P1
+ {
+ get
+ {
+ return field;
+ }
+ set
+ {
+ field = value;
+ }
+ }
+
+ public static int P2
+ {
+ get
+ {
+#line 100
+ throw null;
+#line 200
+ }
+ set
+ {
+ }
+ }
+
+ public static int P3
+ {
+ get
+ {
+ return field;
+ }
+ set
+ {
+ field = value;
+ }
+ }
+}
+";
+
+ var testData = Evaluate(
+ source,
+ OutputKind.DynamicallyLinkedLibrary,
+ methodName: "C.get_P2",
+ atLineNumber: 100, debugFormat: DebugInformationFormat.PortablePdb,
+ expr: "field",
+ resultProperties: out _,
+ error: out string error);
+
+ Assert.Equal("error CS0103: The name 'field' does not exist in the current context", error);
+ }
}
}
diff --git a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/HoistedThisTests.cs b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/HoistedThisTests.cs
index 5c8a2b590dd1e..a27352f88ef39 100644
--- a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/HoistedThisTests.cs
+++ b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/HoistedThisTests.cs
@@ -1435,7 +1435,8 @@ private static void CheckIteratorOverloading(string source, Func().Single(t => GeneratedNameParser.GetKind(t.Name) == GeneratedNameKind.StateMachineType);
var moveNextMethod = stateMachineType.GetMember("MoveNext");
- var guessedIterator = CompilationContext.GetSubstitutedSourceMethod(new EECompilationContextMethod(comp2, moveNextMethod), sourceMethodMustBeInstance: true);
+ var guessedIterator = new CompilationContext(comp2, currentFrame: moveNextMethod, currentSourceMethod: moveNextMethod, locals: [], inScopeHoistedLocalSlots: [], methodDebugInfo: MethodDebugInfo.None).
+ GetSubstitutedUserDefinedSourceMethod(new EECompilationContextMethod(comp2, moveNextMethod));
Assert.Equal(iteratorMethod, ((EECompilationContextMethod)guessedIterator.OriginalDefinition).UnderlyingMethod.OriginalDefinition);
}
}