]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR preprocessor/60975 (-Wvariadic-macros does not print warning)
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 19 Aug 2014 22:37:49 +0000 (22:37 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Tue, 19 Aug 2014 22:37:49 +0000 (22:37 +0000)
gcc/ChangeLog:

2014-08-20  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR c/60975
PR c/53063
* doc/options.texi (CPP): Document it.
* doc/invoke.texi (Wvariadic-macros): Fix documentation.
* optc-gen.awk: Handle CPP.
* opth-gen.awk: Likewise.

gcc/c-family/ChangeLog:

2014-08-20  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR c/60975
PR c/53063
* c.opt (Wvariadic-macros): Use CPP and LangEnabledBy.
* c-opts.c (c_common_handle_option): Call cpp_handle_option_auto.
(c_common_post_options): Call init_global_opts_from_cpp.
(sanitize_cpp_opts): Do not handle Wvariadic-macros here.

gcc/testsuite/ChangeLog:

2014-08-20  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR c/60975
PR c/53063
* gcc.dg/cpp/Wvariadic-1p.c: New test.

From-SVN: r214200

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-opts.c
gcc/c-family/c.opt
gcc/doc/invoke.texi
gcc/doc/options.texi
gcc/optc-gen.awk
gcc/opth-gen.awk
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/Wvariadic-1p.c [new file with mode: 0644]

index ef0673d405afdd4101bc024cd1950d5d63aaf5c1..91c4a1fda9578096faf5b94cb397c7a2f8a45d7a 100644 (file)
@@ -1,3 +1,12 @@
+2014-08-20  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       PR c/60975
+       PR c/53063
+       * doc/options.texi (CPP): Document it.
+       * doc/invoke.texi (Wvariadic-macros): Fix documentation.
+       * optc-gen.awk: Handle CPP.
+       * opth-gen.awk: Likewise.
+
 2014-08-19  David Malcolm  <dmalcolm@redhat.com>
 
        * rtl.h (unlink_insn_chain): Strengthen return type from rtx to
index e458f5e2250e8c7126e7bcda5d2660bc8051da9f..34a91c8a74c0d0edc47f1274987467c9b4938b44 100644 (file)
@@ -1,3 +1,12 @@
+2014-08-20  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       PR c/60975
+       PR c/53063
+       * c.opt (Wvariadic-macros): Use CPP and LangEnabledBy.
+       * c-opts.c (c_common_handle_option): Call cpp_handle_option_auto.
+       (c_common_post_options): Call init_global_opts_from_cpp.
+       (sanitize_cpp_opts): Do not handle Wvariadic-macros here.
+
 2014-08-19  Marek Polacek  <polacek@redhat.com>
 
        PR c++/62153
index b0cad20b4f99ac12958702421c7e74445b5a0b77..2b423e2174b24ee4697f4b3b7cfd7f0e9c9ae246 100644 (file)
@@ -794,7 +794,8 @@ c_common_handle_option (size_t scode, const char *arg, int value,
     default:
       gcc_unreachable ();
     }
-  
+
+  cpp_handle_option_auto (&global_options, scode, cpp_opts);
   return result;
 }
 
@@ -1030,6 +1031,7 @@ c_common_post_options (const char **pfilename)
   cb->file_change = cb_file_change;
   cb->dir_change = cb_dir_change;
   cpp_post_options (parse_in);
+  init_global_opts_from_cpp (&global_options, cpp_get_options (parse_in));
 
   input_location = UNKNOWN_LOCATION;
 
@@ -1310,11 +1312,6 @@ sanitize_cpp_opts (void)
                      && (c_dialect_cxx () ? cxx_dialect == cxx98 : !flag_isoc99));
   cpp_opts->cpp_warn_long_long = warn_long_long;
 
-  /* Similarly with -Wno-variadic-macros.  No check for c99 here, since
-     this also turns off warnings about GCCs extension.  */
-  cpp_opts->warn_variadic_macros
-    = cpp_warn_variadic_macros && (pedantic || warn_traditional);
-
   /* If we're generating preprocessor output, emit current directory
      if explicitly requested or if debugging information is enabled.
      ??? Maybe we should only do it for debugging formats that
index f97a11a19cc773fcb610cef1fc57624c5a0440e8..f33a42578f80cac6893a7778dca1200566fcb3a8 100644 (file)
@@ -838,9 +838,13 @@ C ObjC C++ ObjC++ Var(warn_unused_result) Init(1) Warning
 Warn if a caller of a function, marked with attribute warn_unused_result, does not use its return value
 
 Wvariadic-macros
-C ObjC C++ ObjC++ Var(cpp_warn_variadic_macros) Init(1) Warning
+C ObjC C++ ObjC++ CPP(warn_variadic_macros) Var(cpp_warn_variadic_macros) Warning LangEnabledBy(C ObjC C++ ObjC++,Wpedantic)
 Warn about using variadic macros
 
+Wvariadic-macros
+LangEnabledBy(C ObjC C++ ObjC++,Wtraditional)
+;
+
 Wvarargs
 C ObjC C++ ObjC++ Warning Var(warn_varargs) Init(1)
 Warn about questionable usage of the macros used to retrieve variable arguments
index b8e42949f21951df5dcec96adda4f5b001ccb484..f8499bc046a68ef34871d874aadfe0bd3fb6d398 100644 (file)
@@ -5127,9 +5127,10 @@ modes.  To inhibit the warning messages, use @option{-Wno-long-long}.
 @item -Wvariadic-macros
 @opindex Wvariadic-macros
 @opindex Wno-variadic-macros
-Warn if variadic macros are used in pedantic ISO C90 mode, or the GNU
-alternate syntax when in pedantic ISO C99 mode.  This is default.
-To inhibit the warning messages, use @option{-Wno-variadic-macros}.
+Warn if variadic macros are used in ISO C90 mode, or if the GNU
+alternate syntax is used in ISO C99 mode.  This is enabled by either
+@option{-Wpedantic} or @option{-Wtraditional}.  To inhibit the warning
+messages, use @option{-Wno-variadic-macros}.
 
 @item -Wvarargs
 @opindex Wvarargs
index 938017adeac84ddbceff6cdcec6cc96514fe1f2c..ac4452e6ff464e18d73d353052692c7d286b9cab 100644 (file)
@@ -482,4 +482,9 @@ The option is omitted from the producer string written by
 @item PchIgnore
 Even if this is a target option, this option will not be recorded / compared
 to determine if a precompiled header file matches.
+
+@item CPP(@var{var})
+The state of this option should be kept in sync with the preprocessor
+option @var{var}.
+
 @end table
index b70e4fe3aad2507d5a35b0a875d0b78d51ec037b..ef80c99b6dc3eda189ac05d420453384d6505f84 100644 (file)
@@ -480,4 +480,55 @@ for (i = 0; i < n_langs; i++) {
     print "}               "
 }
 
+#Handle CPP()
+print "\n"
+print "#include " quote "cpplib.h" quote;
+print "void"
+print "cpp_handle_option_auto (const struct gcc_options * opts,                   "
+print "                        size_t scode, struct cpp_options * cpp_opts)"    
+print "{                                                                     "
+print "  enum opt_code code = (enum opt_code) scode;                         "
+print "                                                                      "
+print "  switch (code)                                                       "
+print "    {                                                                 "
+for (i = 0; i < n_opts; i++) {
+    # With identical flags, pick only the last one.  The
+    # earlier loop ensured that it has all flags merged,
+    # and a nonempty help text if one of the texts was nonempty.
+    while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
+        i++;
+    }
+
+    cpp_option = nth_arg(0, opt_args("CPP", flags[i]));
+    opt_var_name = var_name(flags[i]);
+    if (cpp_option != "" && opt_var_name != "") {
+        print "    case " opt_enum(opts[i]) ":"
+        print "      cpp_opts->" cpp_option " = opts->x_" opt_var_name ";"
+        print "      break;"
+    }
 }
+print "    default:    "
+print "      break;    "
+print "    }           "
+print "}\n"
+print "void"
+print "init_global_opts_from_cpp(struct gcc_options * opts,                   "
+print "                         const struct cpp_options * cpp_opts)"    
+print "{                                                                     "
+for (i = 0; i < n_opts; i++) {
+    # With identical flags, pick only the last one.  The
+    # earlier loop ensured that it has all flags merged,
+    # and a nonempty help text if one of the texts was nonempty.
+    while( i + 1 != n_opts && opts[i] == opts[i + 1] ) {
+        i++;
+    }
+    cpp_option = nth_arg(0, opt_args("CPP", flags[i]));
+    opt_var_name = var_name(flags[i]);
+    if (cpp_option != "" && opt_var_name != "") {
+        print "  opts->x_" opt_var_name " = cpp_opts->" cpp_option ";"
+    }
+}
+print "}               "
+
+}
+
index 45aee342ed3a1789e81ad61462c271cb0a9fbdf0..4e8f21f406be7014c2099eaa1b49d3358921cb66 100644 (file)
@@ -315,6 +315,10 @@ for (i = 0; i < n_langs; i++) {
     print "                           const struct cl_option_handlers *handlers, "
     print "                           diagnostic_context *dc);                   "
 }
+print "void cpp_handle_option_auto (const struct gcc_options * opts, size_t scode,"
+print "                             struct cpp_options * cpp_opts);"
+print "void init_global_opts_from_cpp(struct gcc_options * opts,      "
+print "                               const struct cpp_options * cpp_opts);"    
 print "#endif";
 print "#endif";
 print "";
index c0d28556127d6c95a141f532b2175a065f22a844..94f04227a9f94a645c8e294167fdf5230b1f0d5c 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-20  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       PR c/60975
+       PR c/53063
+       * gcc.dg/cpp/Wvariadic-1p.c: New test.
+
 2014-08-19  Janis Johnson  <janisjo@codesourcery.com>
 
        * lib/target-supports.exp 
diff --git a/gcc/testsuite/gcc.dg/cpp/Wvariadic-1p.c b/gcc/testsuite/gcc.dg/cpp/Wvariadic-1p.c
new file mode 100644 (file)
index 0000000..84a7108
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-std=iso9899:1990 " } */
+#pragma GCC diagnostic error "-Wpedantic"
+
+#define f(x,...)       /* { dg-error "variadic" } */
+#define g(x,y...)      /* { dg-error "variadic" } */
+int not_empty;
+/* { dg-message "warnings being treated as errors" "" { target *-*-* } 0 } */