I thought of a way to pacify -Wswitch-enum without much trouble.
Either add all the enums, or if that’s too verbose use ‘switch (+E)’
to indicate to the reader that there need not be a case for
every enum value. Since this approach improves static checking,
make the change everywhere and check it with -Wswitch-enum.
* configure.ac: Compile with -Wswitch-enum if it works and
--enable-gcc-warnings. No need to remove -Wswitch-default
since Gnulib no longer adds it.
* src/chmod.c (describe_change):
* src/chown-core.c (describe_change):
* src/copy.c (copy_debug_string, copy_debug_sparse_string):
* src/df.c (decode_output_arg, get_dev):
* src/du.c (main):
* src/factor.c (print_factors):
* src/head.c (diagnose_copy_fd_failure):
* src/ls.c (time_type_to_statx, calc_req_mask)
(decode_line_length, get_funky_string, parse_ls_color)
(gobble_file, print_long_format):
* src/split.c (main):
* src/sync.c (sync_arg):
* src/tr.c (is_char_class_member):
* src/wc.c (main):
Add switch cases to pacify -Wswitch-enum.
* src/copy.c (copy_debug_string, copy_debug_sparse_string):
Add unreachable () for unreachable cases.
* src/digest.c (main):
* src/od.c (decode_one_format):
* src/tr.c (get_next, get_spec_stats):
switch (E) → switch (+E).
* src/digest.c (main):
* src/tr.c (get_next):
Omit unnecessary ‘default: break;’ that merely pacified GCC,
as the new pacification style is better.
* src/ls.c (decode_line_length):
Add default unreachable case to prevent warning that function
might not return a value.
(gobble_file): Distinguish DEREF_NEVER from unreachable cases.
nw="$nw -Wredundant-decls" # openat.h declares e.g., mkdirat
nw="$nw -Wformat-nonliteral" # who.c and pinky.c strftime uses
nw="$nw -Wnested-externs" # use of XARGMATCH/verify_function__
- nw="$nw -Wswitch-enum" # Too many warnings for now
- nw="$nw -Wswitch-default" # Too many warnings for now
nw="$nw -Wstack-protector" # not worth working around
nw="$nw -Wformat-overflow=2" # False alarms due to GCC bug 110333
nw="$nw -Wformat-truncation=2" # False alarm in ls.c, probably related
# Code like that still infloops with gcc-4.6.0 and -O2. Scary indeed.
gl_MANYWARN_ALL_GCC([ws])
+ AS_VAR_APPEND([ws], [' -Wswitch-enum'])
gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw])
for w in $ws; do
gl_WARN_ADD([$w])
printf (_("%s could not be accessed\n"), quoted_file);
return;
- default:
+ case CH_FAILED: case CH_NO_CHANGE_REQUESTED: case CH_SUCCEEDED:
break;
}
fmt = _("mode of %s retained as %04lo (%s)\n");
printf (fmt, quoted_file, m, &perms[1]);
return;
- default:
+ case CH_NO_STAT: case CH_NOT_APPLIED: default:
affirm (false);
}
printf (fmt, quoted_file, old_m, &old_perms[1], m, &perms[1]);
: group ? _("group of %s retained as %s\n")
: _("ownership of %s retained\n"));
break;
+ case CH_NOT_APPLIED:
default:
affirm (false);
}
case COPY_DEBUG_YES: return "yes";
case COPY_DEBUG_AVOIDED: return "avoided";
case COPY_DEBUG_UNSUPPORTED: return "unsupported";
- default: return "unknown";
+ case COPY_DEBUG_UNKNOWN: return "unknown";
+
+ case COPY_DEBUG_EXTERNAL:
+ case COPY_DEBUG_EXTERNAL_INTERNAL:
+ default: unreachable ();
}
}
case COPY_DEBUG_YES: return "zeros";
case COPY_DEBUG_EXTERNAL: return "SEEK_HOLE";
case COPY_DEBUG_EXTERNAL_INTERNAL: return "SEEK_HOLE + zeros";
- default: return "unknown";
+ case COPY_DEBUG_UNKNOWN: return "unknown";
+
+ case COPY_DEBUG_AVOIDED:
+ case COPY_DEBUG_UNSUPPORTED:
+ default: unreachable ();
}
}
alloc_field (field, N_("Avail"));
break;
+ case INVALID_FIELD:
default:
affirm (!"invalid field");
}
cell = xstrdup (mount_point);
break;
+ case INVALID_FIELD:
default:
affirm (!"unhandled field");
}
#endif
#if HASH_ALGO_CKSUM
- switch (cksum_algorithm)
+ switch (+cksum_algorithm)
{
case bsd:
case sysv:
_("--check is not supported with "
"--algorithm={bsd,sysv,crc,crc32b}"));
break;
- default:
- break;
}
if (base64_digest && raw_digest)
goto argv_iter_done;
case AI_ERR_MEM:
xalloc_die ();
- default:
+ case AI_ERR_OK: default:
affirm (!"unexpected error code from argv_iter");
}
}
/* Try GMP. */
break;
+ case LONGINT_INVALID:
+ case LONGINT_INVALID_SUFFIX_CHAR:
+ case LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW:
default:
error (0, 0, _("%s is not a valid positive integer"), quote (input));
return false;
case COPY_FD_UNEXPECTED_EOF:
error (0, errno, _("%s: file has shrunk too much"), quotef (filename));
break;
- default:
+ case COPY_FD_OK: default:
affirm (false);
}
}
return STATX_ATIME;
case time_btime:
return STATX_BTIME;
- default:
+ case time_numtypes: default:
unreachable ();
}
return 0;
case sort_size:
mask |= STATX_SIZE;
break;
- default:
+ case sort_numtypes: default:
unreachable ();
}
case LONGINT_OVERFLOW:
return 0;
- default:
+ case LONGINT_INVALID:
+ case LONGINT_INVALID_SUFFIX_CHAR:
+ case LONGINT_INVALID_SUFFIX_CHAR_WITH_OVERFLOW:
return -1;
+
+ default:
+ unreachable ();
}
}
state = ST_ERROR;
break;
- default:
+ case ST_END: case ST_ERROR: default:
unreachable ();
}
}
case PS_FAIL:
goto done;
- default:
+ case PS_DONE: default:
affirm (false);
}
}
}
FALLTHROUGH;
- default: /* DEREF_NEVER */
+ case DEREF_NEVER:
err = do_lstat (full_name, &f->stat);
do_deref = false;
break;
+
+ case DEREF_UNDEFINED: default:
+ unreachable ();
}
if (err != 0)
if (when_timespec.tv_sec == -1 && when_timespec.tv_nsec == -1)
btime_ok = false;
break;
- default:
+ case time_numtypes: default:
unreachable ();
}
unreachable ();
}
- switch (size_spec)
+ switch (+size_spec)
{
case CHAR:
print_function = (fmt == SIGNED_DECIMAL
size_t decimal_point_len =
(locale->decimal_point[0] ? strlen (locale->decimal_point) : 1);
- switch (size_spec)
+ switch (+size_spec)
{
case FLOAT_HALF:
print_function = fmt == BFLOATING_POINT
}
break;
- default:
+ case type_undef: default:
affirm (false);
}
sync_status = fsync (fd);
break;
-#if HAVE_SYNCFS
case MODE_FILE_SYSTEM:
+#if HAVE_SYNCFS
sync_status = syncfs (fd);
break;
#endif
-
- default:
+ case MODE_SYNC: default:
unreachable ();
}
case CC_XDIGIT:
result = c_isxdigit (c);
break;
- default:
+ case CC_NO_CLASS: default:
unreachable ();
}
case RE_CHAR_CLASS:
if (class)
{
- switch (p->u.char_class)
+ switch (+p->u.char_class)
{
case CC_LOWER:
*class = UL_LOWER;
case CC_UPPER:
*class = UL_UPPER;
break;
- default:
- break;
}
}
for (int i = 0; i < N_CHARS; i++)
if (is_char_class_member (p->u.char_class, i))
++len;
- switch (p->u.char_class)
+ switch (+p->u.char_class)
{
case CC_UPPER:
case CC_LOWER:
case AI_ERR_MEM:
xalloc_die ();
- default:
+ case AI_ERR_OK: default:
unreachable ();
}