Sorry I'm a little late with my comments but I noticed one minor
problem (I raised bug 71249 for it since the patch has already
been checked in), and have a question about the hunk below:

@@ -1595,6 +1595,32 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
        gimplify_ctxp->case_labels.create (8);

        gimplify_stmt (&SWITCH_BODY (switch_expr), &switch_body_seq);
+
+      /* Possibly warn about unreachable statements between switch's
+        controlling expression and the first case.  */
+      if (warn_switch_unreachable
+         /* This warning doesn't play well with Fortran when optimizations
+            are on.  */
+         && !lang_GNU_Fortran ()
+         && switch_body_seq != NULL)
+       {
+         gimple_seq seq = switch_body_seq;
+         if (gimple_code (switch_body_seq) == GIMPLE_BIND)
+           seq = gimple_bind_body (as_a <gbind *> (switch_body_seq));
+         gimple *stmt = gimple_seq_first_stmt (seq);
+         enum gimple_code code = gimple_code (stmt);
+         if (code != GIMPLE_LABEL && code != GIMPLE_TRY)

Why exempt GIMPLE_TRY?  It suppresses the warning in cases like:

  switch (i) {
  try { } catch (...) { }
  case 1: ;
  }

(If excluding GIMPLE_TRY is unavoidable, it might be worthwhile
to add a comment to the code, and perhaps also mention it in
the documentation to preempt bug reports by nitpickers like me ;)

Finally, while even this simple warning can be useful, it would
be even more helpful if it could also point out other unreachable
statements within the body of the switch statements after
a break/goto/return and before a subsequent label.  This could
be especially valuable with optimization to make possible
diagnosing non-trivial problems like this:

  switch (i) {
  case 3:
    if (i < 3)
       return 1;
    i = 8;
  }

(I realize this might be outside the scope of the feature request
and starting to creep into the -Wunreachable-code territory.)

Martin

Reply via email to