summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog36
-rw-r--r--gcc/Makefile.in8
-rw-r--r--gcc/c-common.c6
-rw-r--r--gcc/c-opts.c4
-rw-r--r--gcc/diagnostic.c71
-rw-r--r--gcc/diagnostic.h48
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/cpp.c8
-rw-r--r--gcc/opts-diagnostic.h25
-rw-r--r--gcc/opts.c54
-rw-r--r--gcc/toplev.c11
11 files changed, 208 insertions, 68 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f0c6e852524..becf94a1ae2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,39 @@
+2010-05-26 Joseph Myers <joseph@codesourcery.com>
+
+ * diagnostic.c: Don't include opts.h.
+ (permissive_error_option): Define.
+ (diagnostic_initialize): Take n_opts parameter. Allocate memory
+ for classify_diagnostic. Don't use memset for
+ classify_diagnostic. Initialize new and recently added fields.
+ (diagnostic_classify_diagnostic): Use context->n_opts instead of
+ N_OPTS.
+ (diagnostic_report_diagnostic): Pass context parameter to
+ diagnostic_report_warnings_p. Use option_enabled and option_name
+ hooks from context.
+ (emit_diagnostic): Use permissive_error_option.
+ (permerror): Likewise.
+ * diagnostic.h: Don't include options.h.
+ (struct diagnostic_context): Add n_opts, opt_permissive,
+ inhibit_warnings, warn_system_headers, option_enabled and
+ option_name fields. Change classify_diagnostic to a pointer.
+ * opts-diagnostic.h: New file.
+ * opts.c: Include opts-diagnostic.h.
+ (common_handle_option): Set global_dc fields for -Wfatal-errors,
+ -Wsystem-headers, -fshow-column, -pedantic-errors and -w.
+ (option_name): New function.
+ * c-opts.c (c_common_init_options): Set global_dc->opt_permissive.
+ (c_common_handle_option): Set global_dc->permissive for
+ -fpermissive.
+ * c-common.c (c_cpp_error): Save and restore
+ global_dc->warn_system_headers, not variable warn_system_headers.
+ * toplev.c: Include opts-diagnostic.h.
+ (general_init): Update call to diagnostic_initialize. Set
+ global_dc->show_column, global_dc->option_enabled and
+ global_dc->option_name.
+ (process_options): Don't set global_dc fields here.
+ * Makefile.in (DIAGNOSTIC_H): Remove options.h.
+ (diagnostic.o, opts.o, toplev.o): Update dependencies.
+
2010-04-30 Hariharan Sandanagobalane <hariharan@picochip.com>
* config/picochip/picochip.md (movsi): Split a movsi from a
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 6e32d8115f2..bbb16f9a743 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -942,7 +942,7 @@ TREE_SSA_LIVE_H = tree-ssa-live.h $(PARTITION_H) vecprim.h
TREE_VECTORIZER_H = tree-vectorizer.h $(TREE_DATA_REF_H)
SSAEXPAND_H = ssaexpand.h $(TREE_SSA_LIVE_H)
PRETTY_PRINT_H = pretty-print.h $(INPUT_H) $(OBSTACK_H)
-DIAGNOSTIC_H = diagnostic.h diagnostic.def $(PRETTY_PRINT_H) options.h
+DIAGNOSTIC_H = diagnostic.h diagnostic.def $(PRETTY_PRINT_H)
C_PRETTY_PRINT_H = c-pretty-print.h $(PRETTY_PRINT_H) $(C_COMMON_H) $(TREE_H)
SCEV_H = tree-scalar-evolution.h $(GGC_H) tree-chrec.h $(PARAMS_H)
LAMBDA_H = lambda.h $(TREE_H) vec.h $(GGC_H)
@@ -2735,12 +2735,12 @@ fold-const.o : fold-const.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
$(GIMPLE_H) realmpfr.h
diagnostic.o : diagnostic.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
version.h $(INPUT_H) $(TOPLEV_H) intl.h $(DIAGNOSTIC_H) \
- diagnostic.def opts.h
+ diagnostic.def
opts.o : opts.c opts.h options.h $(TOPLEV_H) $(CONFIG_H) $(SYSTEM_H) \
coretypes.h $(TREE_H) $(TM_H) langhooks.h $(GGC_H) $(EXPR_H) $(RTL_H) \
output.h $(DIAGNOSTIC_H) $(TM_P_H) $(INSN_ATTR_H) intl.h $(TARGET_H) \
$(FLAGS_H) $(PARAMS_H) $(TREE_PASS_H) $(DBGCNT_H) debug.h \
- $(PLUGIN_H) $(EXCEPT_H) $(LTO_STREAMER_H)
+ $(PLUGIN_H) $(EXCEPT_H) $(LTO_STREAMER_H) opts-diagnostic.h
opts-common.o : opts-common.c opts.h $(CONFIG_H) $(SYSTEM_H) \
coretypes.h intl.h
targhooks.o : targhooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TREE_H) \
@@ -2766,7 +2766,7 @@ toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
$(CGRAPH_H) $(COVERAGE_H) alloc-pool.h $(GGC_H) $(INTEGRATE_H) \
opts.h params.def tree-mudflap.h $(TREE_PASS_H) $(GIMPLE_H) \
tree-ssa-alias.h $(PLUGIN_H) realmpfr.h tree-diagnostic.h \
- tree-pretty-print.h
+ tree-pretty-print.h opts-diagnostic.h
$(COMPILER) $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) \
-DTARGET_NAME=\"$(target_noncanonical)\" \
-c $(srcdir)/toplev.c $(OUTPUT_OPTION)
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 04b2909535d..cadf7574ccd 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -8364,7 +8364,7 @@ c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
{
diagnostic_info diagnostic;
diagnostic_t dlevel;
- int save_warn_system_headers = warn_system_headers;
+ bool save_warn_system_headers = global_dc->warn_system_headers;
bool ret;
switch (level)
@@ -8372,7 +8372,7 @@ c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
case CPP_DL_WARNING_SYSHDR:
if (flag_no_output)
return false;
- warn_system_headers = 1;
+ global_dc->warn_system_headers = 1;
/* Fall through. */
case CPP_DL_WARNING:
if (flag_no_output)
@@ -8409,7 +8409,7 @@ c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
c_option_controlling_cpp_error (reason));
ret = report_diagnostic (&diagnostic);
if (level == CPP_DL_WARNING_SYSHDR)
- warn_system_headers = save_warn_system_headers;
+ global_dc->warn_system_headers = save_warn_system_headers;
return ret;
}
diff --git a/gcc/c-opts.c b/gcc/c-opts.c
index fb2b8e2349e..d83045be48c 100644
--- a/gcc/c-opts.c
+++ b/gcc/c-opts.c
@@ -304,6 +304,8 @@ c_common_init_options (unsigned int argc, const char **argv)
diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
}
+ global_dc->opt_permissive = OPT_fpermissive;
+
parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
ident_hash, line_table);
cb = cpp_get_callbacks (parse_in);
@@ -848,7 +850,7 @@ c_common_handle_option (size_t scode, const char *arg, int value,
break;
case OPT_fpermissive:
- flag_permissive = value;
+ global_dc->permissive = flag_permissive = value;
break;
case OPT_fpreprocessed:
diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index c16ec7cafe0..0fbf58fa928 100644
--- a/gcc/diagnostic.c
+++ b/gcc/diagnostic.c
@@ -31,11 +31,11 @@ along with GCC; see the file COPYING3. If not see
#include "toplev.h"
#include "intl.h"
#include "diagnostic.h"
-#include "opts.h"
#define pedantic_warning_kind(DC) \
((DC)->pedantic_errors ? DK_ERROR : DK_WARNING)
#define permissive_error_kind(DC) ((DC)->permissive ? DK_WARNING : DK_ERROR)
+#define permissive_error_option(DC) ((DC)->opt_permissive)
/* Prototypes. */
static char *build_message_string (const char *, ...) ATTRIBUTE_PRINTF_1;
@@ -77,8 +77,10 @@ file_name_as_prefix (const char *f)
/* Initialize the diagnostic message outputting machinery. */
void
-diagnostic_initialize (diagnostic_context *context)
+diagnostic_initialize (diagnostic_context *context, int n_opts)
{
+ int i;
+
/* Allocate a basic pretty-printer. Clients will replace this a
much more elaborated pretty-printer if they wish. */
context->printer = XNEW (pretty_printer);
@@ -91,13 +93,24 @@ diagnostic_initialize (diagnostic_context *context)
memset (context->diagnostic_count, 0, sizeof context->diagnostic_count);
context->some_warnings_are_errors = false;
context->warning_as_error_requested = false;
- memset (context->classify_diagnostic, DK_UNSPECIFIED,
- sizeof context->classify_diagnostic);
+ context->n_opts = n_opts;
+ context->classify_diagnostic = XNEWVEC (diagnostic_t, n_opts);
+ for (i = 0; i < n_opts; i++)
+ context->classify_diagnostic[i] = DK_UNSPECIFIED;
context->show_option_requested = false;
context->abort_on_error = false;
+ context->show_column = false;
+ context->pedantic_errors = false;
+ context->permissive = false;
+ context->opt_permissive = 0;
+ context->fatal_errors = false;
+ context->inhibit_warnings = false;
+ context->warn_system_headers = false;
context->internal_error = NULL;
diagnostic_starter (context) = default_diagnostic_starter;
diagnostic_finalizer (context) = default_diagnostic_finalizer;
+ context->option_enabled = NULL;
+ context->option_name = NULL;
context->last_module = 0;
context->x_data = NULL;
context->lock = 0;
@@ -295,7 +308,7 @@ diagnostic_classify_diagnostic (diagnostic_context *context,
diagnostic_t old_kind;
if (option_index <= 0
- || option_index >= N_OPTS
+ || option_index >= context->n_opts
|| new_kind >= DK_LAST_DIAGNOSTIC_KIND)
return DK_UNSPECIFIED;
@@ -322,7 +335,7 @@ diagnostic_report_diagnostic (diagnostic_context *context,
/* Give preference to being able to inhibit warnings, before they
get reclassified to something else. */
if ((diagnostic->kind == DK_WARNING || diagnostic->kind == DK_PEDWARN)
- && !diagnostic_report_warnings_p (location))
+ && !diagnostic_report_warnings_p (context, location))
return false;
if (diagnostic->kind == DK_PEDWARN)
@@ -360,7 +373,7 @@ diagnostic_report_diagnostic (diagnostic_context *context,
{
/* This tests if the user provided the appropriate -Wfoo or
-Wno-foo option. */
- if (! option_enabled (diagnostic->option_index))
+ if (! context->option_enabled (diagnostic->option_index))
return false;
/* This tests if the user provided the appropriate -Werror=foo
option. */
@@ -405,38 +418,20 @@ diagnostic_report_diagnostic (diagnostic_context *context,
saved_format_spec = diagnostic->message.format_spec;
if (context->show_option_requested)
{
- const char * option_text = NULL;
+ char *option_text;
- if (diagnostic->option_index)
- {
- /* A warning classified as an error. */
- if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
- && diagnostic->kind == DK_ERROR)
- option_text
- = ACONCAT ((cl_options[OPT_Werror_].opt_text,
- /* Skip over "-W". */
- cl_options[diagnostic->option_index].opt_text + 2,
- NULL));
- /* A warning with option. */
- else
- option_text = cl_options[diagnostic->option_index].opt_text;
- }
- /* A warning without option classified as an error. */
- else if (orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
- || diagnostic->kind == DK_WARNING)
- {
- if (context->warning_as_error_requested)
- option_text = cl_options[OPT_Werror].opt_text;
- else
- option_text = _("enabled by default");
- }
+ option_text = context->option_name (context, diagnostic->option_index,
+ orig_diag_kind, diagnostic->kind);
if (option_text)
- diagnostic->message.format_spec
- = ACONCAT ((diagnostic->message.format_spec,
- " ",
- "[", option_text, "]",
- NULL));
+ {
+ diagnostic->message.format_spec
+ = ACONCAT ((diagnostic->message.format_spec,
+ " ",
+ "[", option_text, "]",
+ NULL));
+ free (option_text);
+ }
}
diagnostic->message.locus = &diagnostic->location;
diagnostic->message.x_data = &diagnostic->x_data;
@@ -519,7 +514,7 @@ emit_diagnostic (diagnostic_t kind, location_t location, int opt,
{
diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
permissive_error_kind (global_dc));
- diagnostic.option_index = OPT_fpermissive;
+ diagnostic.option_index = permissive_error_option (global_dc);
}
else {
diagnostic_set_info (&diagnostic, gmsgid, &ap, location, kind);
@@ -638,7 +633,7 @@ permerror (location_t location, const char *gmsgid, ...)
va_start (ap, gmsgid);
diagnostic_set_info (&diagnostic, gmsgid, &ap, location,
permissive_error_kind (global_dc));
- diagnostic.option_index = OPT_fpermissive;
+ diagnostic.option_index = permissive_error_option (global_dc);
va_end (ap);
return report_diagnostic (&diagnostic);
}
diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h
index 9fd508b78ff..7aa053188d4 100644
--- a/gcc/diagnostic.h
+++ b/gcc/diagnostic.h
@@ -23,7 +23,6 @@ along with GCC; see the file COPYING3. If not see
#define GCC_DIAGNOSTIC_H
#include "pretty-print.h"
-#include "options.h"
/* Constants used to discriminate diagnostics. */
typedef enum
@@ -73,12 +72,17 @@ struct diagnostic_context
/* True if it has been requested that warnings be treated as errors. */
bool warning_as_error_requested;
- /* For each option index that can be passed to warning() et all
- (OPT_* from options.h), this array may contain a new kind that
- the diagnostic should be changed to before reporting, or
- DK_UNSPECIFIED to leave it as the reported kind, or DK_IGNORED to
- not report it at all. N_OPTS is from <options.h>. */
- diagnostic_t classify_diagnostic[N_OPTS];
+ /* The number of option indexes that can be passed to warning() et
+ al. */
+ int n_opts;
+
+ /* For each option index that can be passed to warning() et al
+ (OPT_* from options.h when using this code with the core GCC
+ options), this array may contain a new kind that the diagnostic
+ should be changed to before reporting, or DK_UNSPECIFIED to leave
+ it as the reported kind, or DK_IGNORED to not report it at
+ all. */
+ diagnostic_t *classify_diagnostic;
/* True if we should print the command line option which controls
each diagnostic, if known. */
@@ -96,9 +100,19 @@ struct diagnostic_context
/* True if permerrors are warnings. */
bool permissive;
+ /* The index of the option to associate with turning permerrors into
+ warnings. */
+ int opt_permissive;
+
/* True if errors are fatal. */
bool fatal_errors;
+ /* True if all warnings should be disabled. */
+ bool inhibit_warnings;
+
+ /* True if warnings should be given in system headers. */
+ bool warn_system_headers;
+
/* This function is called before any message is printed out. It is
responsible for preparing message prefix and such. For example, it
might say:
@@ -114,6 +128,18 @@ struct diagnostic_context
/* Client hook to report an internal error. */
void (*internal_error) (diagnostic_context *, const char *, va_list *);
+ /* Client hook to say whether the option controlling a diagnostic is
+ enabled. Returns nonzero if enabled, zero if disabled. */
+ int (*option_enabled) (int);
+
+ /* Client hook to return the name of an option that controls a
+ diagnostic. Returns malloced memory. The first diagnostic_t
+ argument is the kind of diagnostic before any reclassification
+ (of warnings as errors, etc.); the second is the kind after any
+ reclassification. May return NULL if no name is to be printed.
+ May be passed 0 as well as the index of a particular option. */
+ char *(*option_name) (diagnostic_context *, int, diagnostic_t, diagnostic_t);
+
/* Auxiliary data for client. */
void *x_data;
@@ -187,9 +213,9 @@ extern diagnostic_context *global_dc;
#define sorrycount diagnostic_kind_count (global_dc, DK_SORRY)
/* Returns nonzero if warnings should be emitted. */
-#define diagnostic_report_warnings_p(LOC) \
- (!inhibit_warnings \
- && !(in_system_header_at (LOC) && !warn_system_headers))
+#define diagnostic_report_warnings_p(DC, LOC) \
+ (!(DC)->inhibit_warnings \
+ && !(in_system_header_at (LOC) && !(DC)->warn_system_headers))
#define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D)
@@ -203,7 +229,7 @@ extern diagnostic_context *global_dc;
((DI)->option_index = (OPTIDX))
/* Diagnostic related functions. */
-extern void diagnostic_initialize (diagnostic_context *);
+extern void diagnostic_initialize (diagnostic_context *, int);
extern void diagnostic_finish (diagnostic_context *);
extern void diagnostic_report_current_module (diagnostic_context *);
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index be0f29f8a12..1566d08f9b6 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2010-05-26 Joseph Myers <joseph@codesourcery.com>
+
+ * cpp.c (cb_cpp_error): Save and restore
+ global_dc->warn_system_headers, not variable warn_system_headers.
+
2010-05-26 Steven Bosscher <steven@gcc.gnu.org>
* fortran/f95-lang.c: Do not include libfuncs.h, expr.h, and except.h.
diff --git a/gcc/fortran/cpp.c b/gcc/fortran/cpp.c
index 6ff464a8cf0..6361085372e 100644
--- a/gcc/fortran/cpp.c
+++ b/gcc/fortran/cpp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+/* Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GCC.
@@ -975,13 +975,13 @@ cb_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
{
diagnostic_info diagnostic;
diagnostic_t dlevel;
- int save_warn_system_headers = warn_system_headers;
+ bool save_warn_system_headers = global_dc->warn_system_headers;
bool ret;
switch (level)
{
case CPP_DL_WARNING_SYSHDR:
- warn_system_headers = 1;
+ global_dc->warn_system_headers = 1;
/* Fall through. */
case CPP_DL_WARNING:
dlevel = DK_WARNING;
@@ -1012,7 +1012,7 @@ cb_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
diagnostic_override_option_index (&diagnostic, OPT_Wcpp);
ret = report_diagnostic (&diagnostic);
if (level == CPP_DL_WARNING_SYSHDR)
- warn_system_headers = save_warn_system_headers;
+ global_dc->warn_system_headers = save_warn_system_headers;
return ret;
}
diff --git a/gcc/opts-diagnostic.h b/gcc/opts-diagnostic.h
new file mode 100644
index 00000000000..5d23c71a1f9
--- /dev/null
+++ b/gcc/opts-diagnostic.h
@@ -0,0 +1,25 @@
+/* Command line option handling. Interactions with diagnostics code.
+ Copyright (C) 2010 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#ifndef GCC_OPTS_DIAGNOSTIC_H
+#define GCC_OPTS_DIAGNOSTIC_H
+
+extern char *option_name (diagnostic_context *context, int option_index,
+ diagnostic_t orig_diag_kind, diagnostic_t diag_kind);
+#endif
diff --git a/gcc/opts.c b/gcc/opts.c
index 2e788d28fdd..65121a4222e 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -36,6 +36,7 @@ along with GCC; see the file COPYING3. If not see
#include "toplev.h"
#include "params.h"
#include "diagnostic.h"
+#include "opts-diagnostic.h"
#include "tm_p.h" /* For OPTIMIZATION_OPTIONS. */
#include "insn-attr.h" /* For INSN_SCHEDULING. */
#include "target.h"
@@ -1703,6 +1704,10 @@ common_handle_option (size_t scode, const char *arg, int value,
warn_larger_than = value != -1;
break;
+ case OPT_Wfatal_errors:
+ global_dc->fatal_errors = value;
+ break;
+
case OPT_Wframe_larger_than_:
frame_larger_than_size = value;
warn_frame_larger_than = value != -1;
@@ -1726,6 +1731,10 @@ common_handle_option (size_t scode, const char *arg, int value,
warn_strict_overflow = value;
break;
+ case OPT_Wsystem_headers:
+ global_dc->warn_system_headers = value;
+ break;
+
case OPT_Wunused:
warn_unused = value;
break;
@@ -1955,6 +1964,10 @@ common_handle_option (size_t scode, const char *arg, int value,
flag_profile_values_set = true;
break;
+ case OPT_fshow_column:
+ global_dc->show_column = value;
+ break;
+
case OPT_fvisibility_:
{
if (!strcmp(arg, "default"))
@@ -2168,13 +2181,17 @@ common_handle_option (size_t scode, const char *arg, int value,
break;
case OPT_pedantic_errors:
- flag_pedantic_errors = pedantic = 1;
+ global_dc->pedantic_errors = flag_pedantic_errors = pedantic = 1;
break;
case OPT_fwhopr:
flag_whopr = value;
break;
+ case OPT_w:
+ global_dc->inhibit_warnings = true;
+ break;
+
case OPT_fsee:
case OPT_fcse_skip_blocks:
case OPT_floop_optimize:
@@ -2510,3 +2527,38 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
}
free (new_option);
}
+
+/* Return malloced memory for the name of the option OPTION_INDEX
+ which enabled a diagnostic (context CONTEXT), originally of type
+ ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such
+ as -Werror. */
+
+char *
+option_name (diagnostic_context *context, int option_index,
+ diagnostic_t orig_diag_kind, diagnostic_t diag_kind)
+{
+ if (option_index)
+ {
+ /* A warning classified as an error. */
+ if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN)
+ && diag_kind == DK_ERROR)
+ return concat (cl_options[OPT_Werror_].opt_text,
+ /* Skip over "-W". */
+ cl_options[option_index].opt_text + 2,
+ NULL);
+ /* A warning with option. */
+ else
+ return xstrdup (cl_options[option_index].opt_text);
+ }
+ /* A warning without option classified as an error. */
+ else if (orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN
+ || diag_kind == DK_WARNING)
+ {
+ if (context->warning_as_error_requested)
+ return xstrdup (cl_options[OPT_Werror].opt_text);
+ else
+ return xstrdup (_("enabled by default"));
+ }
+ else
+ return NULL;
+}
diff --git a/gcc/toplev.c b/gcc/toplev.c
index aa3eff3be35..83008da3a6b 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -78,6 +78,7 @@ along with GCC; see the file COPYING3. If not see
#include "hosthooks.h"
#include "cgraph.h"
#include "opts.h"
+#include "opts-diagnostic.h"
#include "coverage.h"
#include "value-prof.h"
#include "alloc-pool.h"
@@ -1691,13 +1692,16 @@ general_init (const char *argv0)
/* Initialize the diagnostics reporting machinery, so option parsing
can give warnings and errors. */
- diagnostic_initialize (global_dc);
+ diagnostic_initialize (global_dc, N_OPTS);
diagnostic_starter (global_dc) = default_tree_diagnostic_starter;
/* Set a default printer. Language specific initializations will
override it later. */
pp_format_decoder (global_dc->printer) = &default_tree_printer;
global_dc->show_option_requested = flag_diagnostics_show_option;
+ global_dc->show_column = flag_show_column;
global_dc->internal_error = plugins_internal_error_function;
+ global_dc->option_enabled = option_enabled;
+ global_dc->option_name = option_name;
/* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */
#ifdef SIGSEGV
@@ -1828,11 +1832,6 @@ process_options (void)
if (flag_compare_debug)
diagnostic_inhibit_notes (global_dc);
- global_dc->show_column = flag_show_column;
- global_dc->pedantic_errors = flag_pedantic_errors;
- global_dc->permissive = flag_permissive;
- global_dc->fatal_errors = flag_fatal_errors;
-
if (flag_section_anchors && !target_supports_section_anchors_p ())
{
warning (OPT_fsection_anchors,