1
0
mirror of https://git.savannah.gnu.org/git/gperf.git synced 2025-12-02 13:09:22 +00:00

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.
This commit is contained in:
Bruno Haible
2023-09-05 21:20:51 +02:00
parent 91ed1621cc
commit 8d68fff1c7
10 changed files with 93 additions and 4 deletions

View File

@@ -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 <schmidt@ics.uci.edu>
and Bruno Haible <bruno@clisp.org>.
@@ -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)

View File

@@ -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 <schmidt@ics.uci.edu>
and Bruno Haible <bruno@clisp.org>.
@@ -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);

View File

@@ -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");
}
/* ------------------------------------------------------------------------- */