Instead of informal /*fallthrough*/ comments, use C23 [[fallthrough]] if available. * Makefile (GCC_DEBUG_FLAGS): Add -Wimplicit-fallthrough=5. * private.h (ATTRIBUTE_FALLTHROUGH): New macro, now used whenever switch branches fall through. --- Makefile | 2 +- private.h | 13 +++++++++++++ zdump.c | 2 +- zic.c | 8 ++++---- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index b2c6ff6f..afb9d538 100644 --- a/Makefile +++ b/Makefile @@ -287,7 +287,7 @@ GCC_DEBUG_FLAGS = -DGCC_LINT -g3 -O3 -fno-common \ -Wdeclaration-after-statement -Wdouble-promotion \ -Wduplicated-branches -Wduplicated-cond \ -Wformat=2 -Wformat-overflow=2 -Wformat-signedness -Wformat-truncation \ - -Winit-self -Wlogical-op \ + -Wimplicit-fallthrough=5 -Winit-self -Wlogical-op \ -Wmissing-declarations -Wmissing-prototypes -Wnested-externs \ -Wnull-dereference \ -Wold-style-definition -Woverlength-strings -Wpointer-arith \ diff --git a/private.h b/private.h index 4d667aa0..7a73eff7 100644 --- a/private.h +++ b/private.h @@ -440,6 +440,19 @@ typedef unsigned long uintmax_t; # define HAVE_HAS_C_ATTRIBUTE false #endif +#if HAVE_HAS_C_ATTRIBUTE +# if __has_c_attribute(fallthrough) +# define ATTRIBUTE_FALLTHROUGH [[fallthrough]] +# endif +#endif +#ifndef ATTRIBUTE_FALLTHROUGH +# if 7 <= __GNUC__ +# define ATTRIBUTE_FALLTHROUGH __attribute__((fallthrough)) +# else +# define ATTRIBUTE_FALLTHROUGH ((void) 0) +# endif +#endif + #if HAVE_HAS_C_ATTRIBUTE # if __has_c_attribute(maybe_unused) # define ATTRIBUTE_MAYBE_UNUSED [[maybe_unused]] diff --git a/zdump.c b/zdump.c index 47141655..7acb3e2d 100644 --- a/zdump.c +++ b/zdump.c @@ -503,7 +503,7 @@ main(int argc, char *argv[]) case -1: if (! (optind == argc - 1 && strcmp(argv[optind], "=") == 0)) goto arg_processing_done; - /* Fall through. */ + ATTRIBUTE_FALLTHROUGH; default: usage(stderr, EXIT_FAILURE); } diff --git a/zic.c b/zic.c index 4af0ca27..892414af 100644 --- a/zic.c +++ b/zic.c @@ -1750,15 +1750,15 @@ gethms(char const *string, char const *errstring) default: ok = false; break; case 8: ok = '0' <= xr && xr <= '9'; - /* fallthrough */ + ATTRIBUTE_FALLTHROUGH; case 7: ok &= ssx == '.'; if (ok && noise) warning(_("fractional seconds rejected by" " pre-2018 versions of zic")); - /* fallthrough */ - case 5: ok &= mmx == ':'; /* fallthrough */ - case 3: ok &= hhx == ':'; /* fallthrough */ + ATTRIBUTE_FALLTHROUGH; + case 5: ok &= mmx == ':'; ATTRIBUTE_FALLTHROUGH; + case 3: ok &= hhx == ':'; ATTRIBUTE_FALLTHROUGH; case 1: break; } if (!ok) { -- 2.37.2