diff --git a/src/c99-flex.skl b/src/c99-flex.skl index 9efbadad..d9c1ff52 100644 --- a/src/c99-flex.skl +++ b/src/c99-flex.skl @@ -52,7 +52,19 @@ m4_define([[M4_HOOK_STATE_ENTRY_FORMAT]], [[ &yy_transition[$1], ]]) m4_define([[M4_HOOK_NORMAL_STATE_CASE_ARM]], [[ case $1:]]) m4_define([[M4_HOOK_EOF_STATE_CASE_ARM]], [[ case YY_STATE_EOF($1):]]) -m4_define([[M4_HOOK_EOF_STATE_CASE_FALLTHROUGH]], [[ /* FALLTHROUGH */]]) +m4_define([[M4_HOOK_EOF_STATE_CASE_FALLTHROUGH]], [[ +m4_changequote(<<, >>) + #if defined(__has_c_attribute) + #if __has_c_attribute(fallthrough) + [[fallthrough]]; + #endif + #elif defined(__has_attribute) + #if __has_attribute (fallthrough) + __attribute__((fallthrough)); + #endif + #endif +m4_changequote([[, ]]) +]]) m4_define([[M4_HOOK_EOF_STATE_CASE_TERMINATE]], [[ yyterminate(); ]]) m4_define([[M4_HOOK_TAKE_YYTEXT]], [[yy_do_before_action(yyscanner, yy_cp, yy_bp); /* set up yytext */]]) diff --git a/src/cpp-flex.skl b/src/cpp-flex.skl index 9a84d77f..a94f07ad 100644 --- a/src/cpp-flex.skl +++ b/src/cpp-flex.skl @@ -42,7 +42,19 @@ m4_define([[M4_HOOK_STATE_ENTRY_FORMAT]], [[ &yy_transition[$1], ]]) m4_define([[M4_HOOK_NORMAL_STATE_CASE_ARM]], [[ case $1:]]) m4_define([[M4_HOOK_EOF_STATE_CASE_ARM]], [[ case YY_STATE_EOF($1):]]) -m4_define([[M4_HOOK_EOF_STATE_CASE_FALLTHROUGH]], [[ /* FALLTHROUGH */]]) +m4_define([[M4_HOOK_EOF_STATE_CASE_FALLTHROUGH]], [[ +m4_changequote(<<, >>) + #if defined(__has_cpp_attribute) + #if __has_cpp_attribute(fallthrough) + [[fallthrough]]; + #endif + #elif defined(__has_attribute) + #if __has_attribute (fallthrough) + __attribute__((fallthrough)); + #endif + #endif +m4_changequote([[, ]]) +]]) m4_define([[M4_HOOK_EOF_STATE_CASE_TERMINATE]], [[ yyterminate(); ]]) m4_define([[M4_HOOK_TAKE_YYTEXT]], [[YY_DO_BEFORE_ACTION; /* set up yytext */]]) diff --git a/src/main.c b/src/main.c index 56ca8ae3..9d1bcabf 100644 --- a/src/main.c +++ b/src/main.c @@ -239,10 +239,12 @@ int flex_main (int argc, char *argv[]) /* generate cases for any missing EOF rules */ for (i = 1; i <= lastsc; ++i) if (!sceof[i]) { + if (did_eof_rule) { + out ("M4_HOOK_EOF_STATE_CASE_FALLTHROUGH"); + outc('\n'); + } out_str ("M4_HOOK_EOF_STATE_CASE_ARM(%s)", scname[i]); outc('\n'); - out ("M4_HOOK_EOF_STATE_CASE_FALLTHROUGH"); - outc('\n'); did_eof_rule = true; }