aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-opts.c
diff options
context:
space:
mode:
authorManuel López-Ibáñez <manu@gcc.gnu.org>2010-05-06 10:12:36 +0000
committerManuel López-Ibáñez <manu@gcc.gnu.org>2010-05-06 10:12:36 +0000
commit3734d9607ee407f4c73aa613f96dbfbc0dd6f500 (patch)
treedbd0e72df35da905dec3347904aaa7d7fac6dd9d /gcc/c-opts.c
parent2b90475adda974b77287699beb1180d1cd6e286b (diff)
downloadgcc-3734d9607ee407f4c73aa613f96dbfbc0dd6f500.zip
gcc-3734d9607ee407f4c73aa613f96dbfbc0dd6f500.tar.gz
gcc-3734d9607ee407f4c73aa613f96dbfbc0dd6f500.tar.bz2
re PR c/40989 (-Werror= and #pragma diagnostics do not work with group flags)
2010-05-06 Manuel López-Ibáñez <manu@gcc.gnu.org> PR 40989 * doc/invoke.texi (Wimplicit): Document as C only. * opts.c (common_handle_option): Add argument kind. (handle_option): Rename as read_cmdline_option. Factor out code to... (handle_option): ... here. New. (handle_options): Rename as read_cmdline_options. (decode_options): Update call. (set_option): Use option index instead of option pointer. Classify diagnostics correctly. (enable_warning_as_error): Call handle_option. * opts.h (set_option): Update declaration. (handle_option): Declare. * langhooks.h (struct lang_hooks): Add argument kind to handle_option. * c.opt (Wimplicit,Wimplicit-int): Initialize to -1. * c-opts.c (set_Wimplicit): Delete. (c_family_lang_mask): New static constant. (c_common_handle_option): Add argument kind. Use handle_option instead of set_Wimplicit. (c_common_post_options): warn_implicit and warn_implicit_int are disabled by default. * c-common.c (warn_implicit): Do not define here. * c-common.h (warn_implicit): Do not declare here. (c_common_handle_option): Update declaration. * lto-opts.c (lto_reissue_options): Update call to set_option. java/ * lang.c (java_handle_option): Add argument kind. fortran/ * options.c (gfc_handle_option): Add argument kind. * gfortran.h (gfc_handle_option): Update declaration. ada/ * gcc-interface/misc.c (gnat_handle_option): Add argument kind. testsuite/ * gcc.dg/pr40989.c: New. From-SVN: r159102
Diffstat (limited to 'gcc/c-opts.c')
-rw-r--r--gcc/c-opts.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index 66101b7..b721157 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -106,7 +106,6 @@ static size_t deferred_count;
/* Number of deferred options scanned for -include. */
static size_t include_cursor;
-static void set_Wimplicit (int);
static void handle_OPT_d (const char *);
static void set_std_cxx98 (int);
static void set_std_cxx0x (int);
@@ -135,6 +134,10 @@ static struct deferred_opt
const char *arg;
} *deferred_opts;
+
+static const unsigned int
+c_family_lang_mask = (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX);
+
/* Complain that switch CODE expects an argument but none was
provided. OPT was the command-line option. Return FALSE to get
the default message in opts.c, TRUE if we provide a specialized
@@ -349,7 +352,8 @@ c_common_init_options (unsigned int argc, const char **argv)
invalid, a negative number to prevent language-independent
processing in toplev.c (a hack necessary for the short-term). */
int
-c_common_handle_option (size_t scode, const char *arg, int value)
+c_common_handle_option (size_t scode, const char *arg, int value,
+ int kind)
{
const struct cl_option *option = &cl_options[scode];
enum opt_code code = (enum opt_code) scode;
@@ -362,7 +366,7 @@ c_common_handle_option (size_t scode, const char *arg, int value)
switch (code)
{
default:
- if (cl_options[code].flags & (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX))
+ if (cl_options[code].flags & c_family_lang_mask)
{
if ((option->flags & CL_TARGET)
&& ! targetcm.handle_c_option (scode, arg, value))
@@ -471,7 +475,7 @@ c_common_handle_option (size_t scode, const char *arg, int value)
case OPT_Wall:
warn_unused = value;
set_Wformat (value);
- set_Wimplicit (value);
+ handle_option (OPT_Wimplicit, value, NULL, c_family_lang_mask, kind);
warn_char_subscripts = value;
warn_missing_braces = value;
warn_parentheses = value;
@@ -569,7 +573,13 @@ c_common_handle_option (size_t scode, const char *arg, int value)
break;
case OPT_Wimplicit:
- set_Wimplicit (value);
+ gcc_assert (value == 0 || value == 1);
+ if (warn_implicit_int == -1)
+ handle_option (OPT_Wimplicit_int, value, NULL,
+ c_family_lang_mask, kind);
+ if (warn_implicit_function_declaration == -1)
+ handle_option (OPT_Wimplicit_function_declaration, value, NULL,
+ c_family_lang_mask, kind);
break;
case OPT_Wimport:
@@ -1246,6 +1256,12 @@ c_common_post_options (const char **pfilename)
"-Wformat-security ignored without -Wformat");
}
+ if (warn_implicit == -1)
+ warn_implicit = 0;
+
+ if (warn_implicit_int == -1)
+ warn_implicit_int = 0;
+
/* -Wimplicit-function-declaration is enabled by default for C99. */
if (warn_implicit_function_declaration == -1)
warn_implicit_function_declaration = flag_isoc99;
@@ -1766,15 +1782,6 @@ set_std_cxx0x (int iso)
cxx_dialect = cxx0x;
}
-/* Handle setting implicit to ON. */
-static void
-set_Wimplicit (int on)
-{
- warn_implicit = on;
- warn_implicit_int = on;
- warn_implicit_function_declaration = on;
-}
-
/* Args to -d specify what to dump. Silently ignore
unrecognized options; they may be aimed at toplev.c. */
static void