consistently use "fallthrough" comments in switches

Gcc 7 adds -Wimplicit-fallthrough, which can warn when a
switch case falls through to the next case. The general idea
is that the compiler can't tell if this was intentional or
not, so you should annotate any intentional fall-throughs as
such, leaving it to complain about any unannotated ones.

There's a GNU __attribute__ which can be used for
annotation, but of course we'd have to #ifdef it away on
non-gcc compilers. Gcc will also recognize
specially-formatted comments, which matches our current
practice. Let's extend that practice to all of the
unannotated sites (which I did look over and verify that
they were behaving as intended).

Ideally in each case we'd actually give some reasons in the
comment about why we're falling through, or what we're
falling through to. And gcc does support that with
-Wimplicit-fallthrough=2, which relaxes the comment pattern
matching to anything that contains "fallthrough" (or a
variety of spelling variants). However, this isn't the
default for -Wimplicit-fallthrough, nor for -Wextra. In the
name of simplicity, it's probably better for us to support
the default level, which requires "fallthrough" to be the
only thing in the comment (modulo some window dressing like
"else" and some punctuation; see the gcc manual for the
complete set of patterns).

This patch suppresses all warnings due to
-Wimplicit-fallthrough. We might eventually want to add that
to the DEVELOPER Makefile knob, but we should probably wait
until gcc 7 is more widely adopted (since earlier versions
will complain about the unknown warning type).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2017-09-21 02:25:41 -04:00 коммит произвёл Junio C Hamano
Родитель d0e9983980
Коммит 1cf01a34ea
13 изменённых файлов: 15 добавлений и 4 удалений

Просмотреть файл

@ -2920,6 +2920,7 @@ static int apply_one_fragment(struct apply_state *state,
if (plen && (ws_rule & WS_BLANK_AT_EOF) &&
ws_blank_line(patch + 1, plen, ws_rule))
is_blank_context = 1;
/* fallthrough */
case '-':
memcpy(old, patch + 1, plen);
add_line_info(&preimage, old, plen,
@ -2927,7 +2928,7 @@ static int apply_one_fragment(struct apply_state *state,
old += plen;
if (first == '-')
break;
/* Fall-through for ' ' */
/* fallthrough */
case '+':
/* --no-add does not add new lines */
if (first == '+' && state->no_add)

Просмотреть файл

@ -113,6 +113,7 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,
if (textconv_object(path, obj_context.mode, &oid, 1, &buf, &size))
break;
/* else fallthrough */
case 'p':
type = sha1_object_info(oid.hash, NULL);

Просмотреть файл

@ -436,6 +436,7 @@ static int reset_tree(struct tree *tree, const struct checkout_opts *o,
* update paths in the work tree, and we cannot revert
* them.
*/
/* fallthrough */
case 0:
return 0;
default:

Просмотреть файл

@ -57,7 +57,7 @@ static char *strip_escapes(const char *str, const char *service,
special = str[rpos];
if (rpos == 1)
break;
/* Fall-through to error. */
/* fallthrough */
default:
die("Bad remote-ext placeholder '%%%c'.",
str[rpos]);

Просмотреть файл

@ -1189,6 +1189,7 @@ static int push_check(int argc, const char **argv, const char *prefix)
break;
die("HEAD does not match the named branch in the superproject");
}
/* fallthrough */
default:
die("src refspec '%s' must name a ref",
rs->src);

Просмотреть файл

@ -2353,6 +2353,7 @@ static int store_write_pair(int fd, const char *key, const char *value)
case '"':
case '\\':
strbuf_addch(&sb, '\\');
/* fallthrough */
default:
strbuf_addch(&sb, value[i]);
break;

Просмотреть файл

@ -1545,8 +1545,9 @@ static int ident_filter_fn(struct stream_filter *filter,
switch (ident->state) {
default:
strbuf_add(&ident->left, head, ident->state);
/* fallthrough */
case IDENT_SKIPPING:
/* fallthru */
/* fallthrough */
case IDENT_DRAINING:
ident_drain(ident, &output, osize_p);
}

1
fsck.c
Просмотреть файл

@ -588,6 +588,7 @@ static int fsck_tree(struct tree *item, struct fsck_options *options)
case S_IFREG | 0664:
if (!options->strict)
break;
/* fallthrough */
default:
has_bad_modes = 1;
}

Просмотреть файл

@ -1523,6 +1523,7 @@ static int remote_exists(const char *path)
break;
case HTTP_ERROR:
error("unable to access '%s': %s", url, curl_errorstr);
/* fallthrough */
default:
ret = -1;
}

Просмотреть файл

@ -822,6 +822,7 @@ static void handle_filter(struct mailinfo *mi, struct strbuf *line)
if (!handle_commit_msg(mi, line))
break;
mi->filter_stage++;
/* fallthrough */
case 1:
handle_patch(mi, line);
break;

Просмотреть файл

@ -431,6 +431,7 @@ void tcl_quote_buf(struct strbuf *sb, const char *src)
case '{': case '}':
case '$': case '\\': case '"':
strbuf_addch(sb, '\\');
/* fallthrough */
default:
strbuf_addch(sb, c);
break;

Просмотреть файл

@ -220,6 +220,7 @@ static int ce_modified_check_fs(const struct cache_entry *ce, struct stat *st)
case S_IFDIR:
if (S_ISGITLINK(ce->ce_mode))
return ce_compare_gitlink(ce) ? DATA_CHANGED : 0;
/* else fallthrough */
default:
return TYPE_CHANGED;
}

Просмотреть файл

@ -497,7 +497,7 @@ int send_pack(struct send_pack_args *args,
strbuf_release(&cap_buf);
return atomic_push_failure(args, remote_refs, ref);
}
/* Fallthrough for non atomic case. */
/* else fallthrough */
default:
continue;
}