提交 1c30a57f 编写于 作者: A AlekseyTs

Ensure that partially assigned structures are properly hoisted by async rewriter.

Fixes #1942.
上级 8b65942b
......@@ -130,17 +130,33 @@ private void MarkLocalsUnassigned()
for (int i = 0; i < nextVariableSlot; i++)
{
var symbol = variableBySlot[i].Symbol;
var local = symbol as LocalSymbol;
if ((object)local != null && !local.IsConst)
{
SetSlotState(i, false);
continue;
}
var parameter = symbol as ParameterSymbol;
if ((object)parameter != null)
if ((object)symbol != null)
{
SetSlotState(i, false);
switch (symbol.Kind)
{
case SymbolKind.Local:
if (!((LocalSymbol)symbol).IsConst)
{
SetSlotState(i, false);
}
break;
case SymbolKind.Parameter:
SetSlotState(i, false);
break;
case SymbolKind.Field:
if (!((FieldSymbol)symbol).IsConst)
{
SetSlotState(i, false);
}
break;
default:
Debug.Assert(false);
break;
}
}
}
}
......
......@@ -3288,5 +3288,45 @@ .maxstack 3
}",
sequencePoints: "Test+<F>d__2.MoveNext");
}
[Fact, WorkItem(1942, "https://github.com/dotnet/roslyn/issues/1942")]
public void HoistStructure()
{
var source = @"
using System;
using System.Threading.Tasks;
namespace ConsoleApp
{
struct TestStruct
{
public long i;
public long j;
}
class Program
{
static async Task TestAsync()
{
TestStruct t;
t.i = 12;
Console.WriteLine(""Before {0}"", t.i); // emits ""Before 12""
await Task.Delay(100);
Console.WriteLine(""After {0}"", t.i); // emits ""After 0"" expecting ""After 12""
}
static void Main(string[] args)
{
TestAsync().Wait();
}
}
}";
var expectedOutput = @"Before 12
After 12";
var comp = CreateCompilation(source, options: TestOptions.DebugExe);
CompileAndVerify(comp, expectedOutput: expectedOutput);
CompileAndVerify(comp.WithOptions(TestOptions.ReleaseExe), expectedOutput: expectedOutput);
}
}
}
......@@ -8386,6 +8386,43 @@ End Class
at C.VB$StateMachine_2_M.MoveNext()")
End Sub
<Fact, WorkItem(1942, "https://github.com/dotnet/roslyn/issues/1942")>
Public Sub HoistStructure()
Dim source =
<compilation name="Async">
<file name="a.vb">
Imports System
Imports System.Threading.Tasks
Structure TestStruct
Public i As Long
Public j As Long
End Structure
Class Program
Shared Async Function TestAsync() As Task
Dim t As TestStruct
t.i = 12
Console.WriteLine("Before {0}", t.i)
Await Task.Delay(100)
Console.WriteLine("After {0}", t.i)
End Function
Shared Sub Main()
TestAsync().Wait()
End Sub
End Class
</file>
</compilation>
Dim expectedOutput = <![CDATA[Before 12
After 12]]>
Dim compilation = CompilationUtils.CreateCompilationWithReferences(source, references:=Me.LatestReferences, options:=TestOptions.DebugExe)
CompileAndVerify(compilation, expectedOutput:=expectedOutput)
CompileAndVerify(compilation.WithOptions(TestOptions.ReleaseExe), expectedOutput:=expectedOutput)
End Sub
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册