From 0d37a8763d9a5169ee2cb71a0281f859ca159b87 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 26 Jul 2018 02:00:39 +0200 Subject: Avoid "implicit fallthrough" warnings in the generated code. --- ChangeLog | 9 ++++ NEWS | 2 + src/output.cc | 15 ++++-- tests/c-parse.exp | 5 ++ tests/charsets.exp | 55 ++++++++++++++++++++ tests/chill.exp | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/cplusplus.exp | 10 ++++ tests/java.exp | 5 ++ tests/languages.exp | 15 ++++++ tests/modula2.exp | 35 +++++++++++++ tests/objc.exp | 5 ++ 11 files changed, 298 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 21218d7..0f84fee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2018-07-25 Bruno Haible + + Avoid "implicit fallthrough" warnings in the generated code. + Reported by Phil Willoughby at + . + * src/output.cc (Output::output_hash_function): Emit a more elaborate + fallthrough marker. + * tests/*.exp: Update. + 2018-04-24 Bruno Haible Support input files with CR/LF line terminators. diff --git a/NEWS b/NEWS index 14deb90..8412142 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,8 @@ New in 3.2: Unix line terminators (LF). Note: This is an incompatible change. If you want to use a keyword that ends in a CR byte, such as xyz, write it as "xyz\r". +* The generated code avoids "implicit fallthrough" warnings in 'switch' + statements. New in 3.1: * The generated C code is now in ANSI-C by default. If you want to support diff --git a/src/output.cc b/src/output.cc index d8a8ba9..2e95a31 100644 --- a/src/output.cc +++ b/src/output.cc @@ -1,5 +1,5 @@ /* Output routines. - Copyright (C) 1989-1998, 2000, 2002-2004, 2006-2007, 2009, 2011-2012, 2016 Free Software Foundation, Inc. + Copyright (C) 1989-1998, 2000, 2002-2004, 2006-2007, 2009, 2011-2012, 2016, 2018 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . @@ -932,6 +932,15 @@ Output::output_hash_function () const else { /* We've got to use the correct, but brute force, technique. */ + /* Pseudo-statement or comment that avoids a compiler warning or + lint warning. */ + const char * const fallthrough_marker = + "#if defined __cplusplus && __cplusplus >= 201703L\n" + " [[fallthrough]];\n" + "#elif defined __GNUC__ && __GNUC__ >= 7\n" + " __attribute__ ((__fallthrough__));\n" + "#endif\n" + " /*FALLTHROUGH*/\n"; /* It doesn't really matter whether hval is an 'int' or 'unsigned int', but 'unsigned int' gives fewer warnings. */ printf (" %sunsigned int hval = %s;\n\n" @@ -951,7 +960,7 @@ Output::output_hash_function () const do { if (i > key_pos) - printf (" /*FALLTHROUGH*/\n"); /* Pacify lint. */ + printf ("%s", fallthrough_marker); for ( ; i > key_pos; i--) printf (" case %d:\n", i); @@ -964,7 +973,7 @@ Output::output_hash_function () const while (key_pos != PositionIterator::EOS && key_pos != Positions::LASTCHAR); if (i >= _min_key_len) - printf (" /*FALLTHROUGH*/\n"); /* Pacify lint. */ + printf ("%s", fallthrough_marker); for ( ; i >= _min_key_len; i--) printf (" case %d:\n", i); } diff --git a/tests/c-parse.exp b/tests/c-parse.exp index 3b46a35..d88878c 100644 --- a/tests/c-parse.exp +++ b/tests/c-parse.exp @@ -86,6 +86,11 @@ hash (str, len) { default: hval += asso_values[(unsigned char)str[2]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 2: case 1: diff --git a/tests/charsets.exp b/tests/charsets.exp index 2be2ddf..4af888f 100644 --- a/tests/charsets.exp +++ b/tests/charsets.exp @@ -93,6 +93,11 @@ hash (register const char *str, register size_t len) { default: hval += asso_values[(unsigned char)str[21]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 21: case 20: @@ -106,33 +111,83 @@ hash (register const char *str, register size_t len) case 12: case 11: hval += asso_values[(unsigned char)str[10]+1]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]+1]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]+3]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]+1]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; diff --git a/tests/chill.exp b/tests/chill.exp index faf4bd7..3fc858a 100644 --- a/tests/chill.exp +++ b/tests/chill.exp @@ -84,90 +84,235 @@ hash (str, len) { default: hval += asso_values[(unsigned char)str[29]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 29: hval += asso_values[(unsigned char)str[28]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 28: hval += asso_values[(unsigned char)str[27]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 27: hval += asso_values[(unsigned char)str[26]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 26: hval += asso_values[(unsigned char)str[25]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 25: hval += asso_values[(unsigned char)str[24]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 24: hval += asso_values[(unsigned char)str[23]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 23: hval += asso_values[(unsigned char)str[22]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 22: hval += asso_values[(unsigned char)str[21]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 21: hval += asso_values[(unsigned char)str[20]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 20: hval += asso_values[(unsigned char)str[19]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 19: hval += asso_values[(unsigned char)str[18]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 18: hval += asso_values[(unsigned char)str[17]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 17: hval += asso_values[(unsigned char)str[16]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 16: hval += asso_values[(unsigned char)str[15]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 15: hval += asso_values[(unsigned char)str[14]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 14: hval += asso_values[(unsigned char)str[13]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 13: hval += asso_values[(unsigned char)str[12]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 12: hval += asso_values[(unsigned char)str[11]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 11: hval += asso_values[(unsigned char)str[10]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]+1]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; diff --git a/tests/cplusplus.exp b/tests/cplusplus.exp index 148ad96..20c4471 100644 --- a/tests/cplusplus.exp +++ b/tests/cplusplus.exp @@ -86,11 +86,21 @@ hash (str, len) { default: hval += asso_values[(unsigned char)str[6]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 6: case 5: case 4: hval += asso_values[(unsigned char)str[3]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 3: case 2: diff --git a/tests/java.exp b/tests/java.exp index 44fa7ff..7176106 100644 --- a/tests/java.exp +++ b/tests/java.exp @@ -110,6 +110,11 @@ hash (str, len) { default: hval += asso_values[(unsigned char)str[2]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 2: case 1: diff --git a/tests/languages.exp b/tests/languages.exp index 2de2500..36d36d7 100644 --- a/tests/languages.exp +++ b/tests/languages.exp @@ -97,13 +97,28 @@ hash (register const char *str, register size_t len) { default: hval += asso_values[(unsigned char)str[4]+1]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 4: case 3: hval += asso_values[(unsigned char)str[2]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]+9]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; diff --git a/tests/modula2.exp b/tests/modula2.exp index 02001b7..658223b 100644 --- a/tests/modula2.exp +++ b/tests/modula2.exp @@ -81,24 +81,59 @@ hash (register const char *str, register size_t len) { default: hval += asso_values[(unsigned char)str[7]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; diff --git a/tests/objc.exp b/tests/objc.exp index 2c3374b..379e668 100644 --- a/tests/objc.exp +++ b/tests/objc.exp @@ -84,6 +84,11 @@ hash (register const char *str, register size_t len) { default: hval += asso_values[(unsigned char)str[2]]; +#if defined __cplusplus && __cplusplus >= 201703L + [[fallthrough]]; +#elif defined __GNUC__ && __GNUC__ >= 7 + __attribute__ ((__fallthrough__)); +#endif /*FALLTHROUGH*/ case 2: case 1: -- cgit v1.2.1