re PR other/28322 (GCC new warnings and compatibility)
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Mon, 25 Feb 2008 23:41:43 +0000 (23:41 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Mon, 25 Feb 2008 23:41:43 +0000 (23:41 +0000)
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

gcc/ChangeLog
gcc/opts.c
gcc/opts.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr28322-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr28322.c [new file with mode: 0644]
gcc/testsuite/lib/prune.exp
gcc/toplev.c

index c05c70cee9954cecc2301a9996681583daaccb96..3607c3ce1e782407de344c538b6491e3fa0b69f5 100644 (file)
@@ -1,3 +1,14 @@
+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>
 
        * config/mips/mips.md (loadgp_blockage, blockage): Change type
index 8b8a1a9c364b6488b6b4f0c6ab4ad9d1c15d6e96..8bee44b947abe4c02565f1c8dfbde0444fc03ded 100644 (file)
@@ -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_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.  */
 const char **in_fnames;
 unsigned num_in_fnames;
@@ -443,6 +449,33 @@ complain_wrong_lang (const char *text, const struct cl_option *option,
   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
    LANG_MASK.  Returns the number of switches consumed.  */
 static unsigned int
@@ -472,6 +505,14 @@ handle_option (const char **argv, unsigned int lang_mask)
       opt = dup;
       value = 0;
       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)
index e6bee109e48fce3e4e59d5eb514e191aa542761b..2f543407de0baed738f82cb91f1bcf5469ecf755 100644 (file)
@@ -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,
                                     unsigned int lang_mask);
+extern void print_ignored_options (void);
 #endif
index 415cae7ccc5ac2e2efaf5a67acccfe0d19b69061..7dd0ff39611fd469c2da4576f5f92da09eedef32 100644 (file)
@@ -1,3 +1,11 @@
+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>
 
         PR c++/35333
diff --git a/gcc/testsuite/gcc.dg/pr28322-2.c b/gcc/testsuite/gcc.dg/pr28322-2.c
new file mode 100644 (file)
index 0000000..8fde7b2
--- /dev/null
@@ -0,0 +1,12 @@
+/* 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 } */
+
diff --git a/gcc/testsuite/gcc.dg/pr28322.c b/gcc/testsuite/gcc.dg/pr28322.c
new file mode 100644 (file)
index 0000000..99872fc
--- /dev/null
@@ -0,0 +1,8 @@
+/* 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;
+}
index 2e901a08f4db298fa4f81880795ed10b3ed1e843..d1a9f95bd46b5911ed7c1305b00017fd8afe83c3 100644 (file)
@@ -21,7 +21,7 @@ proc prune_gcc_output { text } {
     #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\]*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)    inlined from \[^\n\]*" $text "" text
     regsub -all "(^|\n)collect2: ld returned \[^\n\]*" $text "" text
index 7a6be498a72cc1672b27aa6e3e0508cbd68c79db..fddf13f39246d263bc5a807c3332c34aad52cf02 100644 (file)
@@ -2282,6 +2282,9 @@ toplev_main (unsigned int argc, const char **argv)
   if (!exit_after_options)
     do_compile ();
 
+  if (warningcount || errorcount) 
+    print_ignored_options ();
+
   if (errorcount || sorrycount)
     return (FATAL_EXIT_CODE);