Capture iterator variable when variable scope yields. Fixes #6587
authorMarek Safar <marek.safar@gmail.com>
Sun, 2 Sep 2012 16:46:16 +0000 (18:46 +0200)
committerMarek Safar <marek.safar@gmail.com>
Sun, 2 Sep 2012 16:48:13 +0000 (18:48 +0200)
mcs/mcs/context.cs
mcs/tests/gtest-iter-27.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml

index 0e45bd5deb2a66ec4f70d8eec6d0062f5354e492..e2ace183f0b1b84d8a385562bae000b06b26427a 100644 (file)
@@ -475,7 +475,7 @@ namespace Mono.CSharp
                        // or it's a parameter
                        //
                        if (CurrentAnonymousMethod.IsIterator)
                        // or it's a parameter
                        //
                        if (CurrentAnonymousMethod.IsIterator)
-                               return local.IsParameter || CurrentBlock.Explicit.HasYield;
+                               return local.IsParameter || local.Block.Explicit.HasYield;
 
                        //
                        // Capture only if this or any of child blocks contain await
 
                        //
                        // Capture only if this or any of child blocks contain await
diff --git a/mcs/tests/gtest-iter-27.cs b/mcs/tests/gtest-iter-27.cs
new file mode 100644 (file)
index 0000000..202964d
--- /dev/null
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+
+public class CompilerBug
+{
+       static void Main ()
+       {
+               foreach (string message in Foo ())
+                       Console.WriteLine (message);
+       }
+
+       static IEnumerable<string> Foo ()
+       {
+               Action fnAction;
+               {
+                       fnAction = () => { };
+               }
+               yield return "Executing action";
+               {
+                       fnAction ();
+               }
+               yield return "Action executed";
+       }
+}
index 4e5b73ee8187f877924d8fc5015f33f3407c1a16..c83183d59b7766a5d25a4ce93c07557bae846a86 100644 (file)
       </method>\r
     </type>\r
   </test>\r
       </method>\r
     </type>\r
   </test>\r
+  <test name="gtest-iter-27.cs">\r
+    <type name="CompilerBug">\r
+      <method name="Void Main()" attrs="145">\r
+        <size>61</size>\r
+      </method>\r
+      <method name="IEnumerable`1 Foo()" attrs="145">\r
+        <size>23</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__Iterator0">\r
+      <method name="System.String System.Collections.Generic.IEnumerator&lt;string&gt;.get_Current()" attrs="2529">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="System.Object System.Collections.IEnumerator.get_Current()" attrs="2529">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="IEnumerator System.Collections.IEnumerable.GetEnumerator()" attrs="481">\r
+        <size>14</size>\r
+      </method>\r
+      <method name="IEnumerator`1 System.Collections.Generic.IEnumerable&lt;string&gt;.GetEnumerator()" attrs="481">\r
+        <size>26</size>\r
+      </method>\r
+      <method name="Boolean MoveNext()" attrs="486">\r
+        <size>161</size>\r
+      </method>\r
+      <method name="Void Dispose()" attrs="486">\r
+        <size>15</size>\r
+      </method>\r
+      <method name="Void Reset()" attrs="486">\r
+        <size>6</size>\r
+      </method>\r
+      <method name="Void &lt;&gt;m__0()" attrs="145">\r
+        <size>2</size>\r
+      </method>\r
+      <method name="Void .ctor()" attrs="6278">\r
+        <size>7</size>\r
+      </method>\r
+    </type>\r
+  </test>\r
   <test name="gtest-lambda-01.cs">\r
     <type name="IntFunc">\r
       <method name="Int32 Invoke(Int32)" attrs="454">\r
   <test name="gtest-lambda-01.cs">\r
     <type name="IntFunc">\r
       <method name="Int32 Invoke(Int32)" attrs="454">\r