diff --git a/aclocal.m4 b/aclocal.m4 index 36d36cf8..43649e70 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -199,3 +199,29 @@ inline int foo(int x) [Define to 1 if your compiler supports C99 extern inline])], [AC_MSG_RESULT([no]) PA_ADD_CFLAGS([-fgnu89-inline])])]) + +dnl -------------------------------------------------------------------------- +dnl PA_CHECK_FALLTHROUGH_ATTRIBUTE +dnl -------------------------------------------------------------------------- +AC_DEFUN(PA_CHECK_FALLTHROUGH_ATTRIBUTE, +[AC_MSG_CHECKING([if $CC supports fallthrough attribute]) + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ +AC_INCLUDES_DEFAULT +int main(int argc, char **argv) +{ + switch (argc) { + case 1: + (void)argc; + __attribute__((fallthrough)); + default: + (void)argv; + break; + } + return argc; +} + ])], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_FALLTHROUGH_ATTRIBUTE], 1, + [Define to 1 if your compiler supports __attribute__((fallthrough))])], + [AC_MSG_RESULT([no])]) +]) diff --git a/configure.ac b/configure.ac index 44c9e179..2f4d26fa 100644 --- a/configure.ac +++ b/configure.ac @@ -294,6 +294,11 @@ dnl options. dnl PA_CHECK_BAD_STDC_INLINE +dnl Figure out if we can use fallthrough attribute or +dnl should provide simple comment instead. +dnl +PA_CHECK_FALLTHROUGH_ATTRIBUTE + dnl dnl support ccache dnl diff --git a/include/compiler.h b/include/compiler.h index fb146af4..f4393518 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -240,6 +240,15 @@ size_t strnlen(const char *s, size_t maxlen); # define inline_prototypes #endif +/* + * Fallthrough handling. + */ +#ifdef HAVE_FALLTHROUGH_ATTRIBUTE +# define fallthrough() __attribute__((fallthrough)) +#else +# define fallthrough() /* fall through */ +#endif + /* * Hints to the compiler that a particular branch of code is more or * less likely to be taken.