In mcs:
authorRaja R Harinath <harinath@hurrynot.org>
Tue, 23 May 2006 10:39:14 +0000 (10:39 -0000)
committerRaja R Harinath <harinath@hurrynot.org>
Tue, 23 May 2006 10:39:14 +0000 (10:39 -0000)
* flowanalysis.cs (UsageVector.MergeOrigins): If an origin is
unreachable, skip it.
(FlowBranchingException.Merge): Always propagate jumps, even if
the finally block renders subsequent code unreachable.

In gmcs:
* flowanalysis.cs (UsageVector.MergeOrigins): If an origin is
unreachable, skip it.
(FlowBranchingException.Merge): Always propagate jumps, even if
the finally block renders subsequent code unreachable.

In tests:
* test-519.cs: New test for compiler crash.

In errors:
* cs0139-3.cs, cs0139-4.cs, cs0139-5.cs, cs0139-6.cs: New
regression tests for 'break' and 'continue' inside a try block.

svn path=/trunk/mcs/; revision=60987

mcs/errors/ChangeLog
mcs/errors/cs0139-3.cs [new file with mode: 0644]
mcs/errors/cs0139-4.cs [new file with mode: 0644]
mcs/errors/cs0139-5.cs [new file with mode: 0644]
mcs/errors/cs0139-6.cs [new file with mode: 0644]
mcs/gmcs/ChangeLog
mcs/gmcs/flowanalysis.cs
mcs/mcs/ChangeLog
mcs/mcs/flowanalysis.cs
mcs/tests/ChangeLog
mcs/tests/test-519.cs [new file with mode: 0644]

index 2939ff6463d096d0328239412cc91082ffcb0201..53e4e8693dfa819e58ad94ee5dea9e3363119397 100644 (file)
@@ -1,3 +1,8 @@
+2006-05-23  Raja R Harinath  <rharinath@novell.com>
+
+       * cs0139-3.cs, cs0139-4.cs, cs0139-5.cs, cs0139-6.cs: New
+       regression tests for 'break' and 'continue' inside a try block.
+
 2006-05-18  Raja R Harinath  <rharinath@novell.com>
 
        * cs0162-6.cs, cs0162-7.cs: New tests for unreachable code.
diff --git a/mcs/errors/cs0139-3.cs b/mcs/errors/cs0139-3.cs
new file mode 100644 (file)
index 0000000..63d8a7a
--- /dev/null
@@ -0,0 +1,13 @@
+// cs0139-3.cs: No enclosing loop out of which to break or continue
+// Line: 8
+
+class Foo {
+       static void Main ()
+       {
+               try {
+                       break;
+               } finally {
+                       throw new System.Exception ();
+               }
+       }
+}
diff --git a/mcs/errors/cs0139-4.cs b/mcs/errors/cs0139-4.cs
new file mode 100644 (file)
index 0000000..75491f5
--- /dev/null
@@ -0,0 +1,14 @@
+// cs0139-4.cs: No enclosing loop out of which to break or continue
+// Line: 9
+
+class Foo {
+       static void Main ()
+       {
+               try {
+               } catch {
+                       break;
+               } finally {
+                       throw new System.Exception ();
+               }
+       }
+}
diff --git a/mcs/errors/cs0139-5.cs b/mcs/errors/cs0139-5.cs
new file mode 100644 (file)
index 0000000..260b1ba
--- /dev/null
@@ -0,0 +1,13 @@
+// cs0139-5.cs: No enclosing loop out of which to break or continue
+// Line: 8
+
+class Foo {
+       static void Main ()
+       {
+               try {
+                       continue;
+               } finally {
+                       throw new System.Exception ();
+               }
+       }
+}
diff --git a/mcs/errors/cs0139-6.cs b/mcs/errors/cs0139-6.cs
new file mode 100644 (file)
index 0000000..c5e1e60
--- /dev/null
@@ -0,0 +1,14 @@
+// cs0139-6.cs: No enclosing loop out of which to break or continue
+// Line: 9
+
+class Foo {
+       static void Main ()
+       {
+               try {
+               } catch {
+                       continue;
+               } finally {
+                       throw new System.Exception ();
+               }
+       }
+}
index 37ffc302d2a19f02136ac24a9f0039d8c2beb390..a81a9f31b94980ae17f605e21060c489b86f512d 100644 (file)
@@ -1,3 +1,10 @@
+2006-05-23  Raja R Harinath  <rharinath@novell.com>
+
+       * flowanalysis.cs (UsageVector.MergeOrigins): If an origin is
+       unreachable, skip it.
+       (FlowBranchingException.Merge): Always propagate jumps, even if
+       the finally block renders subsequent code unreachable.
+
 2006-05-18  Raja R Harinath  <rharinath@novell.com>
 
        Fix #77601
index 68cae97de22b601d9e699a396c326ea2beb85a49..026bb08b78c0e3664e259d235a49f5ffa2d8971f 100644 (file)
@@ -543,6 +543,8 @@ namespace Mono.CSharp
 
                                for (UsageVector vector = o_vectors; vector != null; vector = vector.Next) {
                                        Report.Debug (1, "    MERGING BREAK ORIGIN", vector);
+                                       if (vector.Reachability.IsUnreachable)
+                                               continue;
                                        MyBitVector.And (ref locals, vector.locals);
                                        MyBitVector.And (ref parameters, vector.parameters);
                                        reachability.Meet (vector.Reachability);
@@ -1074,29 +1076,25 @@ namespace Mono.CSharp
                        for (UsageVector origin = break_origins; origin != null; origin = origin.Next) {
                                if (finally_vector != null)
                                        origin.MergeChild (finally_vector, false);
-                               if (!origin.Reachability.IsUnreachable)
-                                       Parent.AddBreakOrigin (origin, origin.Location);
+                               Parent.AddBreakOrigin (origin, origin.Location);
                        }
 
                        for (UsageVector origin = continue_origins; origin != null; origin = origin.Next) {
                                if (finally_vector != null)
                                        origin.MergeChild (finally_vector, false);
-                               if (!origin.Reachability.IsUnreachable)
-                                       Parent.AddContinueOrigin (origin, origin.Location);
+                               Parent.AddContinueOrigin (origin, origin.Location);
                        }
 
                        for (UsageVector origin = return_origins; origin != null; origin = origin.Next) {
                                if (finally_vector != null)
                                        origin.MergeChild (finally_vector, false);
-                               if (!origin.Reachability.IsUnreachable)
-                                       Parent.AddReturnOrigin (origin, origin.Location);
+                               Parent.AddReturnOrigin (origin, origin.Location);
                        }
 
                        for (GotoOrigin origin = goto_origins; origin != null; origin = origin.Next) {
                                if (finally_vector != null)
                                        origin.Vector.MergeChild (finally_vector, false);
-                               if (!origin.Vector.Reachability.IsUnreachable)
-                                       Parent.AddGotoOrigin (origin.Vector, origin.GotoStmt);
+                               Parent.AddGotoOrigin (origin.Vector, origin.GotoStmt);
                        }
 
                        return vector;
index acd242de2f050ba3f05529bc7ce3b2fbd1892eb5..7b16f53eab2abc370aef34d0dd83c565f8f3de54 100644 (file)
@@ -1,3 +1,10 @@
+2006-05-23  Raja R Harinath  <rharinath@novell.com>
+
+       * flowanalysis.cs (UsageVector.MergeOrigins): If an origin is
+       unreachable, skip it.
+       (FlowBranchingException.Merge): Always propagate jumps, even if
+       the finally block renders subsequent code unreachable.
+
 2006-05-18  Raja R Harinath  <rharinath@novell.com>
 
        Fix #77601
index 12feb35f3737869ee08cc57fdb8a5406ea276666..d276747046f7a40773366bdc6d29757e6fe08ea3 100644 (file)
@@ -543,6 +543,8 @@ namespace Mono.CSharp
 
                                for (UsageVector vector = o_vectors; vector != null; vector = vector.Next) {
                                        Report.Debug (1, "    MERGING BREAK ORIGIN", vector);
+                                       if (vector.Reachability.IsUnreachable)
+                                               continue;
                                        MyBitVector.And (ref locals, vector.locals);
                                        MyBitVector.And (ref parameters, vector.parameters);
                                        reachability.Meet (vector.Reachability);
@@ -1074,29 +1076,25 @@ namespace Mono.CSharp
                        for (UsageVector origin = break_origins; origin != null; origin = origin.Next) {
                                if (finally_vector != null)
                                        origin.MergeChild (finally_vector, false);
-                               if (!origin.Reachability.IsUnreachable)
-                                       Parent.AddBreakOrigin (origin, origin.Location);
+                               Parent.AddBreakOrigin (origin, origin.Location);
                        }
 
                        for (UsageVector origin = continue_origins; origin != null; origin = origin.Next) {
                                if (finally_vector != null)
                                        origin.MergeChild (finally_vector, false);
-                               if (!origin.Reachability.IsUnreachable)
-                                       Parent.AddContinueOrigin (origin, origin.Location);
+                               Parent.AddContinueOrigin (origin, origin.Location);
                        }
 
                        for (UsageVector origin = return_origins; origin != null; origin = origin.Next) {
                                if (finally_vector != null)
                                        origin.MergeChild (finally_vector, false);
-                               if (!origin.Reachability.IsUnreachable)
-                                       Parent.AddReturnOrigin (origin, origin.Location);
+                               Parent.AddReturnOrigin (origin, origin.Location);
                        }
 
                        for (GotoOrigin origin = goto_origins; origin != null; origin = origin.Next) {
                                if (finally_vector != null)
                                        origin.Vector.MergeChild (finally_vector, false);
-                               if (!origin.Vector.Reachability.IsUnreachable)
-                                       Parent.AddGotoOrigin (origin.Vector, origin.GotoStmt);
+                               Parent.AddGotoOrigin (origin.Vector, origin.GotoStmt);
                        }
 
                        return vector;
index 361238aeee42345e1043f3a49504b61c934a6fa3..d03fc5c84385016c77a5c77461d3315612265220 100644 (file)
@@ -1,3 +1,7 @@
+2006-05-23  Raja R Harinath  <rharinath@novell.com>
+
+       * test-519.cs: New test for compiler crash.
+
 2006-05-18  Raja R Harinath  <rharinath@novell.com>
 
        * test-518.cs: New test based on #77601.
diff --git a/mcs/tests/test-519.cs b/mcs/tests/test-519.cs
new file mode 100644 (file)
index 0000000..1c78dbe
--- /dev/null
@@ -0,0 +1,23 @@
+class Foo {
+       static int Main ()
+       {
+               try {
+                       f ();
+                       return 1;
+               } catch {
+                       return 0;
+               }
+       }
+       static void f ()
+       {
+               try {
+                       goto skip;
+               } catch {
+                       goto skip;
+               } finally {
+                       throw new System.Exception ();
+               }
+       skip:
+               ;
+       }
+}