From 0aac7c326675ef42ab05ed425dca16a929d18cc3 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Sat, 19 Jul 2025 11:13:43 +0200 Subject: [PATCH 1/2] Avoid case fallthrough before case terminate --- src/main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 56ca8ae3c..9d1bcabf7 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; } From f85c324818d35479b461c8462935123562dbb426 Mon Sep 17 00:00:00 2001 From: Luca Bacci Date: Fri, 18 Jul 2025 18:53:15 +0200 Subject: [PATCH 2/2] [c99, cpp]: Use fallthrough attribute Fixes https://github.com/westes/flex/issues/427 --- src/c99-flex.skl | 14 +++++++++++++- src/cpp-flex.skl | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/c99-flex.skl b/src/c99-flex.skl index 9efbadad6..d9c1ff526 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 9a84d77f4..a94f07adc 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 */]])