re PR other/28322 (GCC new warnings and compatibility)

2008-02-26  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

	PR 28322
	* toplev.c (toplev_main): If there are warnings or error, print
	errors for ignored options.
	* opts.c (ignored_options): New static variable.
	(postpone_unknown_option_error): New.
	(print_ignored_options): New.
	(handle_option): Postpone errors for unknown -Wno-* options.
	* opts.h (print_ignored_options): Declare.
testsuite/
	* gcc.dg/pr28322.c: New.
	* gcc.dg/pr28322-2.c: New.
	* lib/prune.exp: Ignore "At top level" even if there is no ':'
	preceding it.

From-SVN: r132648
parent 23dc794c
2008-02-26 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 28322
* toplev.c (toplev_main): If there are warnings or error, print
errors for ignored options.
* opts.c (ignored_options): New static variable.
(postpone_unknown_option_error): New.
(print_ignored_options): New.
(handle_option): Postpone errors for unknown -Wno-* options.
* opts.h (print_ignored_options): Declare.
2008-02-25 Richard Sandiford <rsandifo@nildram.co.uk> 2008-02-25 Richard Sandiford <rsandifo@nildram.co.uk>
* config/mips/mips.md (loadgp_blockage, blockage): Change type * config/mips/mips.md (loadgp_blockage, blockage): Change type
......
...@@ -365,6 +365,12 @@ DEF_VEC_ALLOC_P(char_p,heap); ...@@ -365,6 +365,12 @@ DEF_VEC_ALLOC_P(char_p,heap);
static VEC(char_p,heap) *flag_instrument_functions_exclude_functions; static VEC(char_p,heap) *flag_instrument_functions_exclude_functions;
static VEC(char_p,heap) *flag_instrument_functions_exclude_files; static VEC(char_p,heap) *flag_instrument_functions_exclude_files;
typedef const char *const_char_p; /* For DEF_VEC_P. */
DEF_VEC_P(const_char_p);
DEF_VEC_ALLOC_P(const_char_p,heap);
static VEC(const_char_p,heap) *ignored_options;
/* Input file names. */ /* Input file names. */
const char **in_fnames; const char **in_fnames;
unsigned num_in_fnames; unsigned num_in_fnames;
...@@ -443,6 +449,33 @@ complain_wrong_lang (const char *text, const struct cl_option *option, ...@@ -443,6 +449,33 @@ complain_wrong_lang (const char *text, const struct cl_option *option,
free (bad_lang); free (bad_lang);
} }
/* Buffer the unknown option described by the string OPT. Currently,
we only complain about unknown -Wno-* options if they may have
prevented a diagnostic. Otherwise, we just ignore them. */
static void postpone_unknown_option_error(const char *opt)
{
VEC_safe_push (const_char_p, heap, ignored_options, opt);
}
/* Produce an error for each option previously buffered. */
void print_ignored_options (void)
{
location_t saved_loc = input_location;
input_location = 0;
while (!VEC_empty (const_char_p, ignored_options))
{
const char *opt;
opt = VEC_pop (const_char_p, ignored_options);
error ("unrecognized command line option \"%s\"", opt);
}
input_location = saved_loc;
}
/* Handle the switch beginning at ARGV for the language indicated by /* Handle the switch beginning at ARGV for the language indicated by
LANG_MASK. Returns the number of switches consumed. */ LANG_MASK. Returns the number of switches consumed. */
static unsigned int static unsigned int
...@@ -472,6 +505,14 @@ handle_option (const char **argv, unsigned int lang_mask) ...@@ -472,6 +505,14 @@ handle_option (const char **argv, unsigned int lang_mask)
opt = dup; opt = dup;
value = 0; value = 0;
opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET); opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
if (opt_index == cl_options_count)
{
/* We don't generate errors for unknown -Wno-* options
unless we issue diagnostics. */
postpone_unknown_option_error (argv[0]);
result = 1;
goto done;
}
} }
if (opt_index == cl_options_count) if (opt_index == cl_options_count)
......
...@@ -105,4 +105,5 @@ extern bool get_option_state (int, struct cl_option_state *); ...@@ -105,4 +105,5 @@ extern bool get_option_state (int, struct cl_option_state *);
extern void enable_warning_as_error (const char *arg, int value, extern void enable_warning_as_error (const char *arg, int value,
unsigned int lang_mask); unsigned int lang_mask);
extern void print_ignored_options (void);
#endif #endif
2008-02-26 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 28322
* gcc.dg/pr28322.c: New.
* gcc.dg/pr28322-2.c: New.
* lib/prune.exp: Ignore "At top level" even if there is no ':'
preceding it.
2008-02-25 Paolo Carlini <pcarlini@suse.de> 2008-02-25 Paolo Carlini <pcarlini@suse.de>
PR c++/35333 PR c++/35333
/* PR28322: ignore unknown -Wno-* if no warning is emitted. */
/* { dg-do compile } */
/* { dg-options "-Wall -Wextra -Wno-foobar" } */
int foo (void)
{
int i = 1/0; /* { dg-warning "division by zero" } */
return i;
}
/* { dg-message "unrecognized command line option .-Wno-foobar." "" { target *-*-* } 0 } */
/* PR28322: ignore unknown -Wno-* if no warning is emitted. */
/* { dg-do compile } */
/* { dg-options " -Wno-foobar -Wno-div-by-zero" } */
void foo(void)
{
int i = 1/0;
}
...@@ -21,7 +21,7 @@ proc prune_gcc_output { text } { ...@@ -21,7 +21,7 @@ proc prune_gcc_output { text } {
#send_user "Before:$text\n" #send_user "Before:$text\n"
regsub -all "(^|\n)(\[^\n\]*: )?In ((static member )?function|member|method|(copy )?constructor|destructor|instantiation|program|subroutine|block-data) \[^\n\]*" $text "" text regsub -all "(^|\n)(\[^\n\]*: )?In ((static member )?function|member|method|(copy )?constructor|destructor|instantiation|program|subroutine|block-data) \[^\n\]*" $text "" text
regsub -all "(^|\n)\[^\n\]*: At (top level|global scope):\[^\n\]*" $text "" text regsub -all "(^|\n)\[^\n\]*(: )?At (top level|global scope):\[^\n\]*" $text "" text
regsub -all "(^|\n)\[^\n\]*: instantiated from \[^\n\]*" $text "" text regsub -all "(^|\n)\[^\n\]*: instantiated from \[^\n\]*" $text "" text
regsub -all "(^|\n) inlined from \[^\n\]*" $text "" text regsub -all "(^|\n) inlined from \[^\n\]*" $text "" text
regsub -all "(^|\n)collect2: ld returned \[^\n\]*" $text "" text regsub -all "(^|\n)collect2: ld returned \[^\n\]*" $text "" text
......
...@@ -2282,6 +2282,9 @@ toplev_main (unsigned int argc, const char **argv) ...@@ -2282,6 +2282,9 @@ toplev_main (unsigned int argc, const char **argv)
if (!exit_after_options) if (!exit_after_options)
do_compile (); do_compile ();
if (warningcount || errorcount)
print_ignored_options ();
if (errorcount || sorrycount) if (errorcount || sorrycount)
return (FATAL_EXIT_CODE); return (FATAL_EXIT_CODE);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment