Capture async block variable when variable scope yields
authorMarek Safar <marek.safar@gmail.com>
Mon, 3 Sep 2012 08:17:51 +0000 (10:17 +0200)
committerMarek Safar <marek.safar@gmail.com>
Mon, 3 Sep 2012 08:17:51 +0000 (10:17 +0200)
mcs/mcs/context.cs
mcs/tests/test-async-39.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml

index e2ace183f0b1b84d8a385562bae000b06b26427a..7192d305db6a0a7e6313805a831c1ac04e1cec96 100644 (file)
@@ -482,7 +482,7 @@ namespace Mono.CSharp
                        // or it's a parameter
                        //
                        if (CurrentAnonymousMethod is AsyncInitializer)
-                               return local.IsParameter || CurrentBlock.Explicit.HasAwait;
+                               return local.IsParameter || local.Block.Explicit.HasAwait || CurrentBlock.Explicit.HasAwait;
 
                        return local.Block.ParametersBlock != CurrentBlock.ParametersBlock.Original;
                }
diff --git a/mcs/tests/test-async-39.cs b/mcs/tests/test-async-39.cs
new file mode 100644 (file)
index 0000000..d02772f
--- /dev/null
@@ -0,0 +1,25 @@
+using System;
+using System.Threading.Tasks;
+
+public class CompilerBug
+{
+       static void Main ()
+       {
+               var res = Foo ().Result;
+               Console.WriteLine (res);
+               return;
+       }
+
+       static async Task<string> Foo ()
+       {
+               Action fnAction;
+               {
+                       fnAction = () => { };
+               }
+               await Task.Delay (10);
+               {
+                       fnAction ();
+               }
+               return "val";
+       }
+}
index c83183d59b7766a5d25a4ce93c07557bae846a86..b61237acaa6052d52b89a4404b33e3a6280f5d59 100644 (file)
       </method>\r
     </type>\r
   </test>\r
+  <test name="test-async-39.cs">\r
+    <type name="CompilerBug">\r
+      <method name="Void Main()" attrs="145">\r
+        <size>24</size>\r
+      </method>\r
+      <method name="System.Threading.Tasks.Task`1[System.String] Foo()" attrs="145">\r
+        <size>33</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+    <type name="CompilerBug+&lt;Foo&gt;c__async0">\r
+      <method name="Void MoveNext()" attrs="486">\r
+        <size>220</size>\r
+      </method>\r
+      <method name="Void SetStateMachine(IAsyncStateMachine)" attrs="486">\r
+        <size>13</size>\r
+      </method>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="test-cls-00.cs">\r
     <type name="CLSCLass_6">\r
       <method name="Void add_Disposed(Delegate)" attrs="2182">\r