[mcs] Reset flowanalysis finally scope per parameters block. Fixes #28196
authorMarek Safar <marek.safar@gmail.com>
Fri, 27 Mar 2015 06:33:16 +0000 (07:33 +0100)
committerMarek Safar <marek.safar@gmail.com>
Fri, 27 Mar 2015 06:33:49 +0000 (07:33 +0100)
mcs/mcs/anonymous.cs
mcs/tests/test-anon-176.cs [new file with mode: 0644]
mcs/tests/ver-il-net_4_5.xml

index b20608ea52def25fa65d522c58746fbab1a0e59e..1063fb1b07774bbf529adea254919c0cd18f71f1 100644 (file)
@@ -1613,14 +1613,17 @@ namespace Mono.CSharp {
                        fc.ParametersBlock = Block;
                        var da_ontrue = fc.DefiniteAssignmentOnTrue;
                        var da_onfalse = fc.DefiniteAssignmentOnFalse;
+                       var prev_tf = fc.TryFinally;
 
                        fc.DefiniteAssignmentOnTrue = fc.DefiniteAssignmentOnFalse = null;
+                       fc.TryFinally = null;
                        block.FlowAnalysis (fc);
 
                        fc.ParametersBlock = prev_pb;
                        fc.DefiniteAssignment = das;
                        fc.DefiniteAssignmentOnTrue = da_ontrue;
                        fc.DefiniteAssignmentOnFalse = da_onfalse;
+                       fc.TryFinally = prev_tf;
                }
 
                public override void MarkReachable (Reachability rc)
diff --git a/mcs/tests/test-anon-176.cs b/mcs/tests/test-anon-176.cs
new file mode 100644 (file)
index 0000000..aeeb66d
--- /dev/null
@@ -0,0 +1,36 @@
+using System;
+
+namespace TestDelegateFinallyOut
+{
+       class Test
+       {
+               static void CallDelegate (Action test)
+               {
+                       throw new Exception ("test");
+               }
+
+               private static bool TestMethod (out int test)
+               {
+                       try {
+                               CallDelegate (delegate {
+                                       return;
+                               });
+                       } catch (Exception) {
+                               Console.WriteLine ("caught exception");
+                       } finally {
+                       }
+                       test = 1;
+                       return false;
+               }
+
+               static int Main ()
+               {
+                       int t;
+                       TestMethod (out t);
+                       if (t != 1)
+                               return 1;
+
+                       return 0;
+               }
+       }
+}
\ No newline at end of file
index e795f12786e1e618869d4788a90f3b36ce0b7b3b..47a797967443ef38c6ad4f1551209263cc58dff7 100644 (file)
       </method>
     </type>
   </test>
+  <test name="test-anon-176.cs">
+    <type name="TestDelegateFinallyOut.Test">
+      <method name="Void CallDelegate(System.Action)" attrs="145">
+        <size>12</size>
+      </method>
+      <method name="Boolean TestMethod(Int32 ByRef)" attrs="145">
+        <size>75</size>
+      </method>
+      <method name="Int32 Main()" attrs="145">
+        <size>32</size>
+      </method>
+      <method name="Void &lt;TestMethod&gt;m__0()" attrs="145">
+        <size>7</size>
+      </method>
+      <method name="Void .ctor()" attrs="6278">
+        <size>7</size>
+      </method>
+    </type>
+  </test>
   <test name="test-anon-18.cs">
     <type name="A">
       <method name="Void Invoke()" attrs="454">