+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.
--- /dev/null
+// 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 ();
+ }
+ }
+}
--- /dev/null
+// 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 ();
+ }
+ }
+}
--- /dev/null
+// 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 ();
+ }
+ }
+}
--- /dev/null
+// 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 ();
+ }
+ }
+}
+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
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);
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;
+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
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);
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;
+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.
--- /dev/null
+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:
+ ;
+ }
+}