opts-common.c (control_warning_option): New.
* opts-common.c (control_warning_option): New. * opts.c (set_default_handlers): New. (decode_options): Use set_default_handlers and control_warning_option. (common_handle_option): Update call to enable_warning_as_error. (enable_warning_as_error): Take gcc_options parameters. Use control_warning_option. * opts.h (set_default_handlers, control_warning_option): Declare. c-family: * c-common.h (c_family_lang_mask): Declare. * c-opts.c (c_family_lang_mask): Make extern. * c-pragma.c (handle_pragma_diagnostic): Use control_warning_option. testsuite: * gcc.dg/pragma-diag-2.c: New test. From-SVN: r166689
This commit is contained in:
parent
a4d8c67600
commit
c5fa0890a2
|
@ -1,3 +1,14 @@
|
|||
2010-11-12 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* opts-common.c (control_warning_option): New.
|
||||
* opts.c (set_default_handlers): New.
|
||||
(decode_options): Use set_default_handlers and
|
||||
control_warning_option.
|
||||
(common_handle_option): Update call to enable_warning_as_error.
|
||||
(enable_warning_as_error): Take gcc_options parameters. Use
|
||||
control_warning_option.
|
||||
* opts.h (set_default_handlers, control_warning_option): Declare.
|
||||
|
||||
2010-11-12 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* Makefile.in (OPTS_H): Define.
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
2010-11-12 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* c-common.h (c_family_lang_mask): Declare.
|
||||
* c-opts.c (c_family_lang_mask): Make extern.
|
||||
* c-pragma.c (handle_pragma_diagnostic): Use
|
||||
control_warning_option.
|
||||
|
||||
2010-11-12 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* c-common.c (parse_optimize_options): Update call to
|
||||
|
|
|
@ -762,6 +762,7 @@ extern void set_compound_literal_name (tree decl);
|
|||
|
||||
extern tree build_va_arg (location_t, tree, tree);
|
||||
|
||||
extern const unsigned int c_family_lang_mask;
|
||||
extern unsigned int c_common_option_lang_mask (void);
|
||||
extern void c_common_initialize_diagnostics (diagnostic_context *);
|
||||
extern bool c_common_complain_wrong_lang_p (const struct cl_option *);
|
||||
|
|
|
@ -132,7 +132,7 @@ static struct deferred_opt
|
|||
} *deferred_opts;
|
||||
|
||||
|
||||
static const unsigned int
|
||||
extern const unsigned int
|
||||
c_family_lang_mask = (CL_C | CL_CXX | CL_ObjC | CL_ObjCXX);
|
||||
|
||||
/* Defer option CODE with argument ARG. */
|
||||
|
@ -467,6 +467,10 @@ c_common_handle_option (size_t scode, const char *arg, int value,
|
|||
cpp_opts->warn_invalid_pch = value;
|
||||
break;
|
||||
|
||||
case OPT_Wlong_long:
|
||||
cpp_opts->cpp_warn_long_long = value;
|
||||
break;
|
||||
|
||||
case OPT_Wmissing_include_dirs:
|
||||
cpp_opts->warn_missing_include_dirs = value;
|
||||
break;
|
||||
|
|
|
@ -720,6 +720,7 @@ handle_pragma_diagnostic(cpp_reader *ARG_UNUSED(dummy))
|
|||
enum cpp_ttype token;
|
||||
diagnostic_t kind;
|
||||
tree x;
|
||||
struct cl_option_handlers handlers;
|
||||
|
||||
token = pragma_lex (&x);
|
||||
if (token != CPP_NAME)
|
||||
|
@ -748,18 +749,14 @@ handle_pragma_diagnostic(cpp_reader *ARG_UNUSED(dummy))
|
|||
if (token != CPP_STRING)
|
||||
GCC_BAD ("missing option after %<#pragma GCC diagnostic%> kind");
|
||||
option_string = TREE_STRING_POINTER (x);
|
||||
set_default_handlers (&handlers);
|
||||
for (option_index = 0; option_index < cl_options_count; option_index++)
|
||||
if (strcmp (cl_options[option_index].opt_text, option_string) == 0)
|
||||
{
|
||||
void *flag_var = option_flag_var (option_index, &global_options);
|
||||
|
||||
/* This overrides -Werror, for example. */
|
||||
diagnostic_classify_diagnostic (global_dc, option_index, kind, input_location);
|
||||
/* This makes sure the option is enabled, like -Wfoo would do. */
|
||||
if (cl_options[option_index].var_type == CLVC_BOOLEAN
|
||||
&& flag_var
|
||||
&& kind != DK_IGNORED)
|
||||
*(int *) flag_var = 1;
|
||||
control_warning_option (option_index, (int) kind, kind != DK_IGNORED,
|
||||
input_location, c_family_lang_mask, &handlers,
|
||||
&global_options, &global_options_set,
|
||||
global_dc);
|
||||
return;
|
||||
}
|
||||
GCC_BAD ("unknown option after %<#pragma GCC diagnostic%> kind");
|
||||
|
|
|
@ -977,3 +977,34 @@ option_flag_var (int opt_index, struct gcc_options *opts)
|
|||
return NULL;
|
||||
return (void *)(((char *) opts) + option->flag_var_offset);
|
||||
}
|
||||
|
||||
/* Set a warning option OPT_INDEX (language mask LANG_MASK, option
|
||||
handlers HANDLERS) to have diagnostic kind KIND for option
|
||||
structures OPTS and OPTS_SET and diagnostic context DC (possibly
|
||||
NULL), at location LOC (UNKNOWN_LOCATION for -Werror=). If IMPLY,
|
||||
the warning option in question is implied at this point. This is
|
||||
used by -Werror= and #pragma GCC diagnostic. */
|
||||
|
||||
void
|
||||
control_warning_option (unsigned int opt_index, int kind, bool imply,
|
||||
location_t loc, unsigned int lang_mask,
|
||||
const struct cl_option_handlers *handlers,
|
||||
struct gcc_options *opts,
|
||||
struct gcc_options *opts_set,
|
||||
diagnostic_context *dc)
|
||||
{
|
||||
if (cl_options[opt_index].alias_target != N_OPTS)
|
||||
opt_index = cl_options[opt_index].alias_target;
|
||||
if (opt_index == OPT_SPECIAL_ignore)
|
||||
return;
|
||||
if (dc)
|
||||
diagnostic_classify_diagnostic (dc, opt_index, (diagnostic_t) kind, loc);
|
||||
if (imply)
|
||||
{
|
||||
/* -Werror=foo implies -Wfoo. */
|
||||
if (cl_options[opt_index].var_type == CLVC_BOOLEAN)
|
||||
handle_generated_option (opts, opts_set,
|
||||
opt_index, NULL, 1, lang_mask,
|
||||
kind, loc, handlers, dc);
|
||||
}
|
||||
}
|
||||
|
|
70
gcc/opts.c
70
gcc/opts.c
|
@ -363,6 +363,8 @@ static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
|
|||
static void enable_warning_as_error (const char *arg, int value,
|
||||
unsigned int lang_mask,
|
||||
const struct cl_option_handlers *handlers,
|
||||
struct gcc_options *opts,
|
||||
struct gcc_options *opts_set,
|
||||
location_t loc,
|
||||
diagnostic_context *dc);
|
||||
|
||||
|
@ -1014,6 +1016,23 @@ default_options_optimization (struct gcc_options *opts,
|
|||
|
||||
static void finish_options (struct gcc_options *, struct gcc_options *);
|
||||
|
||||
/* Set *HANDLERS to the default set of option handlers for use in the
|
||||
compilers proper (not the driver). */
|
||||
void
|
||||
set_default_handlers (struct cl_option_handlers *handlers)
|
||||
{
|
||||
handlers->unknown_option_callback = unknown_option_callback;
|
||||
handlers->wrong_lang_callback = complain_wrong_lang;
|
||||
handlers->post_handling_callback = post_handling_callback;
|
||||
handlers->num_handlers = 3;
|
||||
handlers->handlers[0].handler = lang_handle_option;
|
||||
handlers->handlers[0].mask = initial_lang_mask;
|
||||
handlers->handlers[1].handler = common_handle_option;
|
||||
handlers->handlers[1].mask = CL_COMMON;
|
||||
handlers->handlers[2].handler = target_handle_option;
|
||||
handlers->handlers[2].mask = CL_TARGET;
|
||||
}
|
||||
|
||||
/* Parse command line options and set default flag values. Do minimal
|
||||
options processing. The decoded options are in *DECODED_OPTIONS
|
||||
and *DECODED_OPTIONS_COUNT; settings go in OPTS, OPTS_SET and DC;
|
||||
|
@ -1030,20 +1049,12 @@ decode_options (struct gcc_options *opts, struct gcc_options *opts_set,
|
|||
|
||||
lang_mask = initial_lang_mask;
|
||||
|
||||
handlers.unknown_option_callback = unknown_option_callback;
|
||||
handlers.wrong_lang_callback = complain_wrong_lang;
|
||||
handlers.post_handling_callback = post_handling_callback;
|
||||
handlers.num_handlers = 3;
|
||||
handlers.handlers[0].handler = lang_handle_option;
|
||||
handlers.handlers[0].mask = lang_mask;
|
||||
handlers.handlers[1].handler = common_handle_option;
|
||||
handlers.handlers[1].mask = CL_COMMON;
|
||||
handlers.handlers[2].handler = target_handle_option;
|
||||
handlers.handlers[2].mask = CL_TARGET;
|
||||
set_default_handlers (&handlers);
|
||||
|
||||
/* Enable -Werror=coverage-mismatch by default */
|
||||
enable_warning_as_error ("coverage-mismatch", 1, lang_mask, &handlers,
|
||||
loc, dc);
|
||||
/* Enable -Werror=coverage-mismatch by default. */
|
||||
control_warning_option (OPT_Wcoverage_mismatch, (int) DK_ERROR, true,
|
||||
loc, lang_mask,
|
||||
&handlers, opts, opts_set, dc);
|
||||
|
||||
default_options_optimization (opts, opts_set,
|
||||
decoded_options, decoded_options_count,
|
||||
|
@ -1778,7 +1789,8 @@ common_handle_option (struct gcc_options *opts,
|
|||
break;
|
||||
|
||||
case OPT_Werror_:
|
||||
enable_warning_as_error (arg, value, lang_mask, handlers, loc, dc);
|
||||
enable_warning_as_error (arg, value, lang_mask, handlers,
|
||||
opts, opts_set, loc, dc);
|
||||
break;
|
||||
|
||||
case OPT_Wlarger_than_:
|
||||
|
@ -2411,13 +2423,15 @@ get_option_state (struct gcc_options *opts, int option,
|
|||
}
|
||||
|
||||
/* Enable (or disable if VALUE is 0) a warning option ARG (language
|
||||
mask LANG_MASK, option handlers HANDLERS) as an error for
|
||||
diagnostic context DC (possibly NULL), location LOC. This is used
|
||||
by -Werror=. */
|
||||
mask LANG_MASK, option handlers HANDLERS) as an error for option
|
||||
structures OPTS and OPTS_SET, diagnostic context DC (possibly
|
||||
NULL), location LOC. This is used by -Werror=. */
|
||||
|
||||
static void
|
||||
enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
|
||||
const struct cl_option_handlers *handlers,
|
||||
struct gcc_options *opts,
|
||||
struct gcc_options *opts_set,
|
||||
location_t loc, diagnostic_context *dc)
|
||||
{
|
||||
char *new_option;
|
||||
|
@ -2429,29 +2443,15 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
|
|||
option_index = find_opt (new_option, lang_mask);
|
||||
if (option_index == OPT_SPECIAL_unknown)
|
||||
{
|
||||
error ("-Werror=%s: No option -%s", arg, new_option);
|
||||
error ("-Werror=%s: no option -%s", arg, new_option);
|
||||
}
|
||||
else
|
||||
{
|
||||
const struct cl_option *option = &cl_options[option_index];
|
||||
const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
|
||||
|
||||
if (option->alias_target != N_OPTS)
|
||||
option_index = option->alias_target;
|
||||
if (option_index == OPT_SPECIAL_ignore)
|
||||
return;
|
||||
if (dc)
|
||||
diagnostic_classify_diagnostic (dc, option_index, kind, loc);
|
||||
if (kind == DK_ERROR)
|
||||
{
|
||||
const struct cl_option * const option = cl_options + option_index;
|
||||
|
||||
/* -Werror=foo implies -Wfoo. */
|
||||
if (option->var_type == CLVC_BOOLEAN)
|
||||
handle_generated_option (&global_options, &global_options_set,
|
||||
option_index, NULL, value, lang_mask,
|
||||
(int)kind, loc, handlers, dc);
|
||||
}
|
||||
control_warning_option (option_index, (int) kind, value,
|
||||
loc, lang_mask,
|
||||
handlers, opts, opts_set, dc);
|
||||
}
|
||||
free (new_option);
|
||||
}
|
||||
|
|
|
@ -223,6 +223,7 @@ extern void decode_cmdline_options_to_array_default_mask (unsigned int argc,
|
|||
const char **argv,
|
||||
struct cl_decoded_option **decoded_options,
|
||||
unsigned int *decoded_options_count);
|
||||
extern void set_default_handlers (struct cl_option_handlers *handlers);
|
||||
extern void decode_options (struct gcc_options *opts,
|
||||
struct gcc_options *opts_set,
|
||||
struct cl_decoded_option *decoded_options,
|
||||
|
@ -255,5 +256,12 @@ extern void read_cmdline_option (struct gcc_options *opts,
|
|||
unsigned int lang_mask,
|
||||
const struct cl_option_handlers *handlers,
|
||||
diagnostic_context *dc);
|
||||
extern void control_warning_option (unsigned int opt_index, int kind,
|
||||
bool imply, location_t loc,
|
||||
unsigned int lang_mask,
|
||||
const struct cl_option_handlers *handlers,
|
||||
struct gcc_options *opts,
|
||||
struct gcc_options *opts_set,
|
||||
diagnostic_context *dc);
|
||||
extern void print_ignored_options (void);
|
||||
#endif
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2010-11-12 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc.dg/pragma-diag-2.c: New test.
|
||||
|
||||
2010-11-12 Jerry DeLisle <jvdelisle@gcc.gnu.org>
|
||||
|
||||
PR fortran/45794
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-std=c89 -pedantic -Wno-long-long" } */
|
||||
/* { dg-message "warnings being treated as errors" "" { target *-*-* } 0 } */
|
||||
|
||||
int i = 0LL;
|
||||
|
||||
#pragma GCC diagnostic error "-Wlong-long"
|
||||
|
||||
int j = 1LL; /* { dg-error "long long" } */
|
Loading…
Reference in New Issue