diff --git a/ChangeLog b/ChangeLog index 7e6bbe1..eb6ba23 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2023-09-05 Bruno Haible + + Avoid "gcc -Wmissing-field-initializers" warnings on the generated code. + * src/options.h (Options::has_initializer_suffix): New declaration. + * src/options.cc (Options::has_initializer_suffix): New function. + * src/output.cc (Output::output_keyword_table): If option -t is + specified and option -F is not specified, emit '#pragma GCC diagnostic' + lines, to silence -Wmissing-field-initializers warnings from gcc or + clang. + * tests/charsets.exp: Update. + * tests/gpc.exp: Likewise. + * tests/incomplete.exp: Likewise. + * tests/languages.exp: Likewise. + * tests/objc.exp: Likewise. + * tests/test-4.exp: Likewise. + 2023-07-08 Bruno Haible Avoid "gcc -Wunused-parameter" warnings on the generated hash function. diff --git a/src/options.cc b/src/options.cc index f5f0050..065339e 100644 --- a/src/options.cc +++ b/src/options.cc @@ -1,5 +1,5 @@ /* Handles parsing the Options provided to the user. - Copyright (C) 1989-1998, 2000, 2002-2004, 2006-2009, 2011, 2016-2018, 2022 Free Software Foundation, Inc. + Copyright (C) 1989-1998, 2000, 2002-2004, 2006-2009, 2011, 2016-2018, 2022-2023 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . @@ -627,6 +627,13 @@ Options::set_slot_name (const char *name) _slot_name = name; } +/* Returns true if the struct initializer suffix has been set. */ +bool +Options::has_initializer_suffix () const +{ + return _initializer_suffix != DEFAULT_INITIALIZER_SUFFIX; +} + /* Sets the struct initializer suffix, if not already set. */ void Options::set_initializer_suffix (const char *initializers) diff --git a/src/options.h b/src/options.h index ec83b6d..b340a79 100644 --- a/src/options.h +++ b/src/options.h @@ -2,7 +2,7 @@ /* Handles parsing the Options provided to the user. - Copyright (C) 1989-1998, 2000, 2002-2004, 2011 Free Software Foundation, Inc. + Copyright (C) 1989-1998, 2000, 2002-2004, 2011, 2023 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . @@ -174,6 +174,8 @@ public: /* Returns the struct initializer suffix. */ const char * get_initializer_suffix () const; + /* Returns true if the struct initializer suffix has been set. */ + bool has_initializer_suffix () const; /* Sets the struct initializer suffix, if not already set. */ void set_initializer_suffix (const char *initializers); diff --git a/src/output.cc b/src/output.cc index 63cbdac..9672bf3 100644 --- a/src/output.cc +++ b/src/output.cc @@ -1282,10 +1282,24 @@ output_keyword_blank_entries (int count, const char *indent) void Output::output_keyword_table () const { - const char *indent = option[GLOBAL] ? "" : " "; + const char *indent = option[GLOBAL] ? "" : " "; int index; KeywordExt_List *temp; + /* Avoid compiler warnings "warning: missing initializer for field ..." + for each of the blank entries. */ + bool silence_missing_initializer_warning = + option[TYPE] && !option.has_initializer_suffix(); + const char *preprocessor_condition = + "(defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3)"; + if (silence_missing_initializer_warning) + { + printf ("#if %s\n", preprocessor_condition); + printf ("#pragma GCC diagnostic push\n"); + printf ("#pragma GCC diagnostic ignored \"-Wmissing-field-initializers\"\n"); + printf ("#endif\n"); + } + printf ("%sstatic ", indent); output_const_type (const_readonly_array, _wordlist_eltype); @@ -1341,7 +1355,15 @@ Output::output_keyword_table () const if (index > 0) printf ("\n"); - printf ("%s };\n\n", indent); + printf ("%s };\n", indent); + + if (silence_missing_initializer_warning) + { + printf ("#if %s\n", preprocessor_condition); + printf ("#pragma GCC diagnostic pop\n"); + printf ("#endif\n"); + } + printf ("\n"); } /* ------------------------------------------------------------------------- */ diff --git a/tests/charsets.exp b/tests/charsets.exp index 957926c..e22b7bf 100644 --- a/tests/charsets.exp +++ b/tests/charsets.exp @@ -196,6 +196,10 @@ hash (register const char *str, register size_t len) return hval + asso_values[(unsigned char)str[len - 1]]; } +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif static const struct charset wordlist[] = { {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -1855,6 +1859,9 @@ static const struct charset wordlist[] = {""}, {"hp-desktop", 2021} }; +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic pop +#endif const struct charset * in_word_set (register const char *str, register size_t len) diff --git a/tests/gpc.exp b/tests/gpc.exp index ccfd651..28b5843 100644 --- a/tests/gpc.exp +++ b/tests/gpc.exp @@ -93,6 +93,10 @@ hash (register const char *str, register size_t len) struct resword * is_reserved_word (register const char *str, register size_t len) { +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif static struct resword wordlist[] = { {""}, {""}, @@ -133,6 +137,9 @@ is_reserved_word (register const char *str, register size_t len) {"Goto", GOTO, PASCAL_ISO}, {"Begin", BEGIN_, PASCAL_ISO} }; +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic pop +#endif if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { diff --git a/tests/incomplete.exp b/tests/incomplete.exp index d72492e..4b527ec 100644 --- a/tests/incomplete.exp +++ b/tests/incomplete.exp @@ -83,6 +83,10 @@ hash (register const char *str, register size_t len) struct month * in_word_set (register const char *str, register size_t len) { +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif static struct month wordlist[] = { {""}, {""}, {""}, @@ -101,6 +105,9 @@ in_word_set (register const char *str, register size_t len) {""}, {""}, {""}, {"february", 2, 28, 29} }; +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic pop +#endif if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { diff --git a/tests/languages.exp b/tests/languages.exp index cf4d9fe..ee78705 100644 --- a/tests/languages.exp +++ b/tests/languages.exp @@ -127,6 +127,10 @@ hash (register const char *str, register size_t len) return hval + asso_values[(unsigned char)str[len - 1]]; } +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif static const struct language wordlist[] = { {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -1472,6 +1476,9 @@ static const struct language wordlist[] = {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ile", "Interlingue", 181, "interlingue", 181} }; +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic pop +#endif const struct language * in_word_set (register const char *str, register size_t len) diff --git a/tests/objc.exp b/tests/objc.exp index 3292035..649eac2 100644 --- a/tests/objc.exp +++ b/tests/objc.exp @@ -101,6 +101,10 @@ hash (register const char *str, register size_t len) struct resword * is_reserved_word (register const char *str, register size_t len) { +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif static struct resword wordlist[] = { {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, @@ -174,6 +178,9 @@ is_reserved_word (register const char *str, register size_t len) {""}, {""}, {""}, {""}, {""}, {"void", TYPESPEC, RID_VOID} }; +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic pop +#endif if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { diff --git a/tests/test-4.exp b/tests/test-4.exp index a849023..4822bbc 100644 --- a/tests/test-4.exp +++ b/tests/test-4.exp @@ -84,6 +84,10 @@ hash (register const char *str, register size_t len) struct resword * in_word_set (register const char *str, register size_t len) { +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmissing-field-initializers" +#endif static struct resword wordlist[] = { {"else", ELSE, NORID}, @@ -170,6 +174,9 @@ in_word_set (register const char *str, register size_t len) {"id", OBJECTNAME, RID_ID}, {"in", TYPE_QUAL, RID_IN} }; +#if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) +#pragma GCC diagnostic pop +#endif static short lookup[] = {