2016-07-11  Marek Polacek  <pola...@redhat.com>

        PR c/7652
        * arith.c (eval_intrinsic): Add gcc_fallthrough.
        * array.c (gfc_ref_dimen_size): Likewise.
        (gfc_array_dimen_size): Likewise.
        * cpp.c (gfc_cpp_handle_option): Likewise.
        (cb_cpp_error): Likewise.
        * decl.c (match_implicit_range): Likewise.
        (match_attr_spec): Likewise.
        * dependency.c (gfc_dep_resolver): Likewise.
        * dump-parse-tree.c (show_code_node): Likewise.
        * expr.c (simplify_const_ref): Likewise.
        * frontend-passes.c (optimize_op): Likewise.
        (gfc_expr_walker): Likewise.
        (gfc_code_walker): Likewise.
        * gfortranspec.c: Likewise.
        * interface.c (gfc_check_operator_interface): Likewise.
        * io.c (format_lex): Likewise.
        * openmp.c (resolve_omp_clauses): Likewise.
        * parse.c (next_fixed): Likewise.
        (parse_select_block): Likewise.
        (parse_select_type_block): Likewise.
        (parse_executable): Likewise.
        * primary.c (match_boz_constant): Likewise.
        (match_arg_list_function): Likewise.
        (gfc_match_rvalue): Likewise.
        (match_variable): Likewise.
        * resolve.c (resolve_operator): Likewise.
        (resolve_ref): Likewise.
        (fixup_charlen): Likewise.
        (resolve_allocate_expr): Likewise.
        (gfc_resolve_code): Likewise.
        (build_default_init_expr): Likewise.
        * target-memory.c (gfc_target_interpret_expr): Likewise.
        * trans-array.c (gfc_array_allocate): Likewise.
        * trans-expr.c (flatten_array_ctors_without_strlen): Likewise.
        (gfc_conv_power_op): Likewise.
        (gfc_conv_expr_op): Likewise.
        * trans-intrinsic.c (conv_caf_vector_subscript): Likewise.
        (conv_intrinsic_cobound): Likewise.
        (gfc_conv_intrinsic_len): Likewise.
        * trans-io.c (gfc_build_st_parameter): Likewise.
        (transfer_expr): Likewise.
        * trans-stmt.c (gfc_trans_where_2): Likewise.

diff --git gcc/gcc/fortran/arith.c gcc/gcc/fortran/arith.c
index 47a5504..a56b480 100644
--- gcc/gcc/fortran/arith.c
+++ gcc/gcc/fortran/arith.c
@@ -1504,6 +1504,7 @@ eval_intrinsic (gfc_intrinsic_op op,
        }
 
     /* Fall through  */
+    gcc_fallthrough ();
     case INTRINSIC_EQ:
     case INTRINSIC_EQ_OS:
     case INTRINSIC_NE:
@@ -1523,6 +1524,7 @@ eval_intrinsic (gfc_intrinsic_op op,
 
     /* Fall through  */
     /* Numeric binary  */
+    gcc_fallthrough ();
     case INTRINSIC_PLUS:
     case INTRINSIC_MINUS:
     case INTRINSIC_TIMES:
diff --git gcc/gcc/fortran/array.c gcc/gcc/fortran/array.c
index 03c8b17..d020709 100644
--- gcc/gcc/fortran/array.c
+++ gcc/gcc/fortran/array.c
@@ -2323,6 +2323,7 @@ gfc_ref_dimen_size (gfc_array_ref *ar, int dimen, mpz_t 
*result, mpz_t *end)
          mpz_mul (*end, *end, stride);
          mpz_add (*end, *end, lower);
        }
+      gcc_fallthrough ();
 
     cleanup:
       mpz_clear (upper);
@@ -2432,6 +2433,7 @@ gfc_array_dimen_size (gfc_expr *array, int dimen, mpz_t 
*result)
       }
 
       /* Fall through */
+      gcc_fallthrough ();
     default:
       if (array->shape == NULL)
        return false;
diff --git gcc/gcc/fortran/cpp.c gcc/gcc/fortran/cpp.c
index 8ac8092..df81cbc 100644
--- gcc/gcc/fortran/cpp.c
+++ gcc/gcc/fortran/cpp.c
@@ -390,6 +390,7 @@ gfc_cpp_handle_option (size_t scode, const char *arg, int 
value ATTRIBUTE_UNUSED
     case OPT_MM:
       gfc_cpp_option.deps_skip_system = 1;
       /* fall through */
+      gcc_fallthrough ();
 
     case OPT_M:
       gfc_cpp_option.deps = 1;
@@ -398,6 +399,7 @@ gfc_cpp_handle_option (size_t scode, const char *arg, int 
value ATTRIBUTE_UNUSED
     case OPT_MMD:
       gfc_cpp_option.deps_skip_system = 1;
       /* fall through */
+      gcc_fallthrough ();
 
     case OPT_MD:
       gfc_cpp_option.deps = 1;
@@ -1037,6 +1039,7 @@ cb_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int 
level, int reason,
     case CPP_DL_WARNING_SYSHDR:
       global_dc->dc_warn_system_headers = 1;
       /* Fall through.  */
+      gcc_fallthrough ();
     case CPP_DL_WARNING:
       dlevel = DK_WARNING;
       break;
diff --git gcc/gcc/fortran/decl.c gcc/gcc/fortran/decl.c
index 1b62833..3d6b7e4 100644
--- gcc/gcc/fortran/decl.c
+++ gcc/gcc/fortran/decl.c
@@ -3486,6 +3486,7 @@ match_implicit_range (void)
        {
        case ')':
          inner = 0;            /* Fall through.  */
+         gcc_fallthrough ();
 
        case ',':
          c2 = c1;
@@ -3911,6 +3912,7 @@ match_attr_spec (void)
                      d = DECL_CODIMENSION;
                      break;
                    }
+                 gcc_fallthrough ();
                case 'n':
                  if (match_string_p ("tiguous"))
                    {
diff --git gcc/gcc/fortran/dependency.c gcc/gcc/fortran/dependency.c
index f117de0..207825e 100644
--- gcc/gcc/fortran/dependency.c
+++ gcc/gcc/fortran/dependency.c
@@ -2199,6 +2199,7 @@ gfc_dep_resolver (gfc_ref *lref, gfc_ref *rref, 
gfc_reverse *reverse)
 
              /* Overlap codes are in order of priority.  We only need to
                 know the worst one.*/
+             gcc_fallthrough ();
 
            update_fin_dep:
              if (this_dep > fin_dep)
diff --git gcc/gcc/fortran/dump-parse-tree.c gcc/gcc/fortran/dump-parse-tree.c
index f507434..1170948 100644
--- gcc/gcc/fortran/dump-parse-tree.c
+++ gcc/gcc/fortran/dump-parse-tree.c
@@ -1617,6 +1617,7 @@ show_code_node (int level, gfc_code *c)
     case EXEC_ERROR_STOP:
       fputs ("ERROR ", dumpfile);
       /* Fall through.  */
+      gcc_fallthrough ();
 
     case EXEC_STOP:
       fputs ("STOP ", dumpfile);
@@ -2162,6 +2163,7 @@ show_code_node (int level, gfc_code *c)
 
     case EXEC_FLUSH:
       fputs ("FLUSH", dumpfile);
+      gcc_fallthrough ();
 
     show_filepos:
       fp = c->ext.filepos;
@@ -2378,6 +2380,7 @@ show_code_node (int level, gfc_code *c)
 
     case EXEC_WRITE:
       fputs ("WRITE", dumpfile);
+      gcc_fallthrough ();
 
     show_dt:
       dt = c->ext.dt;
@@ -2468,6 +2471,7 @@ show_code_node (int level, gfc_code *c)
          fputs (" SIGN=", dumpfile);
          show_expr (dt->sign);
        }
+      gcc_fallthrough ();
 
     show_dt_code:
       for (c = c->block->next; c; c = c->next)
diff --git gcc/gcc/fortran/expr.c gcc/gcc/fortran/expr.c
index 7328898..8557ff7 100644
--- gcc/gcc/fortran/expr.c
+++ gcc/gcc/fortran/expr.c
@@ -1646,6 +1646,7 @@ simplify_const_ref (gfc_expr *p)
              p->ref->u.ar.type = AR_FULL;
 
            /* Fall through.  */
+           gcc_fallthrough ();
 
            case AR_FULL:
              if (p->ref->next != NULL
diff --git gcc/gcc/fortran/frontend-passes.c gcc/gcc/fortran/frontend-passes.c
index f02a52a..652ec89 100644
--- gcc/gcc/fortran/frontend-passes.c
+++ gcc/gcc/fortran/frontend-passes.c
@@ -1445,6 +1445,7 @@ optimize_op (gfc_expr *e)
       changed = optimize_comparison (e, op);
 
       /* Fall through */
+      gcc_fallthrough ();
       /* Look at array constructors.  */
     case INTRINSIC_PLUS:
     case INTRINSIC_MINUS:
@@ -3312,6 +3313,7 @@ gfc_expr_walker (gfc_expr **e, walk_expr_fn_t exprfn, 
void *data)
 
            /* Fall through to the variable case in order to walk the
               reference.  */
+           gcc_fallthrough ();
 
          case EXPR_SUBSTRING:
          case EXPR_VARIABLE:
@@ -3345,6 +3347,7 @@ gfc_expr_walker (gfc_expr **e, walk_expr_fn_t exprfn, 
void *data)
                    break;
                  }
              }
+           gcc_fallthrough ();
 
          default:
            break;
@@ -3600,6 +3603,7 @@ gfc_code_walker (gfc_code **c, walk_code_fn_t codefn, 
walk_expr_fn_t exprfn,
              in_omp_workshare = true;
 
              /* Fall through  */
+             gcc_fallthrough ();
 
            case EXEC_OMP_DISTRIBUTE:
            case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
diff --git gcc/gcc/fortran/gfortranspec.c gcc/gcc/fortran/gfortranspec.c
index 8a0e19a..a09b167 100644
--- gcc/gcc/fortran/gfortranspec.c
+++ gcc/gcc/fortran/gfortranspec.c
@@ -395,10 +395,12 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE.\n\n"
        case 0:
          add_arg_libgfortran (static_lib && !static_linking);
          /* Fall through.  */
+         gcc_fallthrough ();
 
        case 1:
          if (need_math)
            append_option (OPT_l, MATH_LIBRARY, 1);
+         gcc_fallthrough ();
        default:
          break;
        }
diff --git gcc/gcc/fortran/interface.c gcc/gcc/fortran/interface.c
index 5bd1279..736112c 100644
--- gcc/gcc/fortran/interface.c
+++ gcc/gcc/fortran/interface.c
@@ -930,6 +930,7 @@ gfc_check_operator_interface (gfc_symbol *sym, 
gfc_intrinsic_op op,
       if (t1 == BT_CHARACTER && t2 == BT_CHARACTER)
        goto bad_repl;
       /* Fall through.  */
+      gcc_fallthrough ();
 
     case INTRINSIC_PLUS:
     case INTRINSIC_MINUS:
diff --git gcc/gcc/fortran/io.c gcc/gcc/fortran/io.c
index 7c648e9..7b6f00f 100644
--- gcc/gcc/fortran/io.c
+++ gcc/gcc/fortran/io.c
@@ -242,6 +242,7 @@ format_lex (void)
     case '-':
       negative_flag = 1;
       /* Falls through.  */
+      gcc_fallthrough ();
 
     case '+':
       c = next_char_not_space (&error);
diff --git gcc/gcc/fortran/openmp.c gcc/gcc/fortran/openmp.c
index 865e0d9..cb08879 100644
--- gcc/gcc/fortran/openmp.c
+++ gcc/gcc/fortran/openmp.c
@@ -3762,6 +3762,7 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses 
*omp_clauses,
                        gfc_error ("Cray pointee object %qs in %s clause at %L",
                                   n->sym->name, name, &n->where);
                      /* FALLTHRU */
+                     gcc_fallthrough ();
                  case OMP_LIST_DEVICE_RESIDENT:
                    check_symbol_not_pointer (n->sym, n->where, name);
                    check_array_not_assumed (n->sym, n->where, name);
diff --git gcc/gcc/fortran/parse.c gcc/gcc/fortran/parse.c
index d795225..65e7b8d 100644
--- gcc/gcc/fortran/parse.c
+++ gcc/gcc/fortran/parse.c
@@ -1235,6 +1235,7 @@ next_fixed (void)
                }
            }
          /* FALLTHROUGH */
+         gcc_fallthrough ();
 
          /* Comments have already been skipped by the time we get
             here so don't bother checking for them.  */
@@ -3609,6 +3610,7 @@ loop:
        break;
 
       /* Fall through */
+      gcc_fallthrough ();
 
     case ST_USE:
     case ST_IMPORT:
@@ -3672,6 +3674,7 @@ declSt:
              break;
            }
 
+         gcc_fallthrough ();
        default:
          break;
        }
@@ -4007,6 +4010,7 @@ parse_select_block (void)
 
          accept_statement (st);
          /* Fall through */
+         gcc_fallthrough ();
 
        case ST_END_SELECT:
          break;
@@ -4091,6 +4095,7 @@ parse_select_type_block (void)
 
          accept_statement (st);
          /* Fall through */
+         gcc_fallthrough ();
 
        case ST_END_SELECT:
          break;
@@ -5103,6 +5108,7 @@ parse_executable (gfc_statement st)
          gfc_notify_std (GFC_STD_F95_OBS, "DATA statement at %C after the "
                          "first executable statement");
          /* Fall through.  */
+         gcc_fallthrough ();
 
        case ST_FORMAT:
        case ST_ENTRY:
diff --git gcc/gcc/fortran/primary.c gcc/gcc/fortran/primary.c
index c2faa0f..141cd86 100644
--- gcc/gcc/fortran/primary.c
+++ gcc/gcc/fortran/primary.c
@@ -366,12 +366,14 @@ match_boz_constant (gfc_expr **result)
     case 'x':
       x_hex = 1;
       /* Fall through.  */
+      gcc_fallthrough ();
     case 'z':
       radix = 16;
       post = 0;
       break;
     case '\'':
       /* Fall through.  */
+      gcc_fallthrough ();
     case '\"':
       delim = post;
       post = 1;
@@ -1686,18 +1688,21 @@ match_arg_list_function (gfc_actual_arglist *result)
              result->name = "%LOC";
              break;
            }
+         gcc_fallthrough ();
        case 'r':
          if (strncmp (name, "ref", 3) == 0)
            {
              result->name = "%REF";
              break;
            }
+         gcc_fallthrough ();
        case 'v':
          if (strncmp (name, "val", 3) == 0)
            {
              result->name = "%VAL";
              break;
            }
+         gcc_fallthrough ();
        default:
          m = MATCH_ERROR;
          goto cleanup;
@@ -3007,6 +3012,7 @@ gfc_match_rvalue (gfc_expr **result)
          m = gfc_match_varspec (e, 0, false, true);
          break;
        }
+      gcc_fallthrough ();
 
     /* Match a function reference.  */
     function0:
@@ -3412,6 +3418,7 @@ match_variable (gfc_expr **result, int equiv_flag, int 
host_flag)
        break;
 
       /* Fall through to error */
+      gcc_fallthrough ();
 
     default:
       gfc_error ("%qs at %C is not a variable", sym->name);
diff --git gcc/gcc/fortran/resolve.c gcc/gcc/fortran/resolve.c
index 4378313..debcd9e 100644
--- gcc/gcc/fortran/resolve.c
+++ gcc/gcc/fortran/resolve.c
@@ -3543,6 +3543,7 @@ resolve_operator (gfc_expr *e)
        return false;
 
     /* Fall through...  */
+    gcc_fallthrough ();
 
     case INTRINSIC_NOT:
     case INTRINSIC_UPLUS:
@@ -3661,6 +3662,7 @@ resolve_operator (gfc_expr *e)
        }
 
       /* Fall through...  */
+      gcc_fallthrough ();
 
     case INTRINSIC_EQ:
     case INTRINSIC_EQ_OS:
@@ -4688,6 +4690,7 @@ resolve_ref (gfc_expr *expr)
                  break;
                }
              /* Fall through.  */
+             gcc_fallthrough ();
            case AR_SECTION:
              current_part_dimension = 1;
              break;
@@ -5419,14 +5422,17 @@ fixup_charlen (gfc_expr *e)
     {
     case EXPR_OP:
       gfc_resolve_character_operator (e);
+      gcc_fallthrough ();
 
     case EXPR_ARRAY:
       if (e->expr_type == EXPR_ARRAY)
        gfc_resolve_character_array_constructor (e);
+      gcc_fallthrough ();
 
     case EXPR_SUBSTRING:
       if (!e->ts.u.cl && e->ref)
        gfc_resolve_substring_charlen (e);
+      gcc_fallthrough ();
 
     default:
       if (!e->ts.u.cl)
@@ -7279,6 +7285,7 @@ resolve_allocate_expr (gfc_expr *e, gfc_code *code, bool 
*array_alloc_wo_spec)
            break;
 
          /* Fall Through...  */
+         gcc_fallthrough ();
 
        case DIMEN_UNKNOWN:
        case DIMEN_VECTOR:
@@ -10432,6 +10439,7 @@ gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
              omp_workshare_save = omp_workshare_flag;
              omp_workshare_flag = 1;
              /* FALL THROUGH */
+             gcc_fallthrough ();
            default:
              gfc_resolve_blocks (code->block, ns);
              break;
@@ -11183,6 +11191,7 @@ build_default_init_expr (gfc_symbol *sym)
        case GFC_INIT_REAL_SNAN:
          init_expr->is_snan = 1;
          /* Fall through.  */
+         gcc_fallthrough ();
        case GFC_INIT_REAL_NAN:
          mpfr_set_nan (init_expr->value.real);
          break;
@@ -11212,6 +11221,7 @@ build_default_init_expr (gfc_symbol *sym)
        case GFC_INIT_REAL_SNAN:
          init_expr->is_snan = 1;
          /* Fall through.  */
+         gcc_fallthrough ();
        case GFC_INIT_REAL_NAN:
          mpfr_set_nan (mpc_realref (init_expr->value.complex));
          mpfr_set_nan (mpc_imagref (init_expr->value.complex));
diff --git gcc/gcc/fortran/target-memory.c gcc/gcc/fortran/target-memory.c
index 0c71c3c..ee1bd73 100644
--- gcc/gcc/fortran/target-memory.c
+++ gcc/gcc/fortran/target-memory.c
@@ -600,6 +600,7 @@ gfc_target_interpret_expr (unsigned char *buffer, size_t 
buffer_size,
     case BT_CLASS:
       result->ts = CLASS_DATA (result)->ts;
       /* Fall through.  */
+      gcc_fallthrough ();
     case BT_DERIVED:
       result->representation.length =
         gfc_interpret_derived (buffer, buffer_size, result);
diff --git gcc/gcc/fortran/trans-array.c gcc/gcc/fortran/trans-array.c
index e95c8dd..81c523d 100644
--- gcc/gcc/fortran/trans-array.c
+++ gcc/gcc/fortran/trans-array.c
@@ -4031,6 +4031,7 @@ done:
                    continue;
                  }
                  /* Otherwise fall through GFC_SS_FUNCTION.  */
+                 gcc_fallthrough ();
              }
            case GFC_ISYM_LCOBOUND:
            case GFC_ISYM_UCOBOUND:
@@ -4040,6 +4041,7 @@ done:
            default:
              continue;
            }
+         gcc_fallthrough ();
 
        case GFC_SS_CONSTRUCTOR:
        case GFC_SS_FUNCTION:
@@ -5451,6 +5453,7 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree 
status, tree errmsg,
          break;
        }
       /* Fall through.  */
+      gcc_fallthrough ();
 
     case AR_SECTION:
       lower = ref->u.ar.start;
diff --git gcc/gcc/fortran/trans-expr.c gcc/gcc/fortran/trans-expr.c
index b5731aa..54ad600 100644
--- gcc/gcc/fortran/trans-expr.c
+++ gcc/gcc/fortran/trans-expr.c
@@ -2102,6 +2102,7 @@ flatten_array_ctors_without_strlen (gfc_expr* e)
        }
 
       /* Otherwise, fall through to handle constructor elements.  */
+      gcc_fallthrough ();
     case EXPR_STRUCTURE:
       for (c = gfc_constructor_first (e->value.constructor);
           c; c = gfc_constructor_next (c))
@@ -2936,6 +2937,7 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
          rse.expr = convert (gfc_int4_type_node, rse.expr);
          res_ikind_2 = ikind;
          /* Fall through.  */
+         gcc_fallthrough ();
 
        case 4:
          ikind = 0;
@@ -2964,6 +2966,7 @@ gfc_conv_power_op (gfc_se * se, gfc_expr * expr)
          else
            gcc_unreachable ();
          /* Fall through.  */
+         gcc_fallthrough ();
 
        case 4:
          kind = 0;
@@ -3202,6 +3205,7 @@ gfc_conv_expr_op (gfc_se * se, gfc_expr * expr)
        }
 
       /* Fallthrough.  */
+      gcc_fallthrough ();
     case INTRINSIC_UPLUS:
       gfc_conv_expr (se, expr->value.op.op1);
       return;
diff --git gcc/gcc/fortran/trans-intrinsic.c gcc/gcc/fortran/trans-intrinsic.c
index c655540..9d20be3 100644
--- gcc/gcc/fortran/trans-intrinsic.c
+++ gcc/gcc/fortran/trans-intrinsic.c
@@ -1047,6 +1047,7 @@ conv_caf_vector_subscript (stmtblock_t *block, tree desc, 
gfc_array_ref *ar)
          stride = gfc_index_one_node;
 
        /* Fall through.  */
+       gcc_fallthrough ();
       case DIMEN_ELEMENT:
        if (ar->start[i])
          {
@@ -2136,6 +2137,7 @@ conv_intrinsic_cobound (gfc_se * se, gfc_expr * expr)
          bound = fold_build2_loc (input_location, MINUS_EXPR,
                                   gfc_array_index_type, bound,
                                   gfc_index_one_node);
+         gcc_fallthrough ();
        case 1:
          break;
        default:
@@ -5330,6 +5332,7 @@ gfc_conv_intrinsic_len (gfc_se * se, gfc_expr * expr)
        }
 
       /* Otherwise fall through.  */
+      gcc_fallthrough ();
 
     default:
       /* Anybody stupid enough to do this deserves inefficient code.  */
diff --git gcc/gcc/fortran/trans-io.c gcc/gcc/fortran/trans-io.c
index aefa96d..829db5d 100644
--- gcc/gcc/fortran/trans-io.c
+++ gcc/gcc/fortran/trans-io.c
@@ -194,6 +194,7 @@ gfc_build_st_parameter (enum ioparam_type ptype, tree 
*types)
          p->field = gfc_add_field_to_struct (t, get_identifier (p->name),
                                              pchar_type_node, &chain);
          /* FALLTHROUGH */
+         gcc_fallthrough ();
        case IOPARM_type_char2:
          len = strlen (p->name);
          gcc_assert (len <= sizeof (name) - sizeof ("_len"));
@@ -2194,6 +2195,7 @@ transfer_expr (gfc_se * se, gfc_typespec * ts, tree 
addr_expr, gfc_code * code)
          return;
        }
       /* Fall through.  */
+      gcc_fallthrough ();
     case BT_HOLLERITH:
       if (se->string_length)
        arg2 = se->string_length;
diff --git gcc/gcc/fortran/trans-stmt.c gcc/gcc/fortran/trans-stmt.c
index 5aa7778..8d527ed 100644
--- gcc/gcc/fortran/trans-stmt.c
+++ gcc/gcc/fortran/trans-stmt.c
@@ -4962,6 +4962,7 @@ gfc_trans_where_2 (gfc_code * code, tree mask, bool 
invert,
             case EXEC_ASSIGN:
               expr1 = cnext->expr1;
               expr2 = cnext->expr2;
+             gcc_fallthrough ();
     evaluate:
               if (nested_forall_info != NULL)
                 {

Reply via email to