Add and use SDL_FALLTHROUGH for fallthroughs

Case fallthrough warnings can be suppressed using the __fallthrough__
compiler attribute. Unfortunately, not all compilers have this
attribute, or even have __has_attribute to check if they have the
__fallthrough__ attribute. [[fallthrough]] is also available in C++17
and the next C2x, but not everyone uses C++17 or C2x.

So define the SDL_FALLTHROUGH macro to deal with those problems - if we
are using C++17 or C2x, it expands to [[fallthrough]]; else if the
compiler has __has_attribute and has the __fallthrough__ attribute, then
it expands to __attribute__((__fallthrough__)); else it expands to an
empty statement, with a /* fallthrough */ comment (it's a do {} while
(0) statement, because users of this macro need to use a semicolon,
because [[fallthrough]] and __attribute__((__fallthrough__)) require a
semicolon).

Applications using SDL are also free to use this macro (because it is
defined in begin_code.h).

All existing /* fallthrough */ comments have been replaced with this
macro. Some of them were unnecessary because they were the last case in
a switch; using SDL_FALLTHROUGH in those cases would result in a compile
error on compilers that support __fallthrough__, for having a
__attribute__((__fallthrough__)) statement that didn't immediately
precede a case label.
This commit is contained in:
Misa
2021-09-27 14:38:12 -07:00
committed by Sam Lantinga
parent 828a0a4a10
commit 66a08aa391
15 changed files with 63 additions and 55 deletions

View File

@@ -562,7 +562,7 @@ WatchJoystick(SDL_Joystick * joystick)
if ((event.key.keysym.sym != SDLK_ESCAPE)) {
break;
}
/* Fall through to signal quit */
SDL_FALLTHROUGH;
case SDL_QUIT:
done = SDL_TRUE;
break;
@@ -755,7 +755,7 @@ main(int argc, char *argv[])
if ((event.key.keysym.sym != SDLK_ESCAPE)) {
break;
}
/* Fall through to signal quit */
SDL_FALLTHROUGH;
case SDL_QUIT:
done = SDL_TRUE;
break;

View File

@@ -386,7 +386,7 @@ loop(void *arg)
if (event.key.keysym.sym != SDLK_ESCAPE) {
break;
}
/* Fall through to signal quit */
SDL_FALLTHROUGH;
case SDL_QUIT:
done = SDL_TRUE;
break;

View File

@@ -183,7 +183,7 @@ loop(void *arg)
(event.key.keysym.sym != SDLK_AC_BACK)) {
break;
}
/* Fall through to signal quit */
SDL_FALLTHROUGH;
case SDL_FINGERDOWN:
case SDL_MOUSEBUTTONDOWN:
case SDL_QUIT: