]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR preprocessor/61389 (libcpp diagnostics shouldn't talk about ISO C99 for C+...
authorEdward Smith-Rowland <3dw4rd@verizon.net>
Thu, 10 Jul 2014 22:26:50 +0000 (22:26 +0000)
committerEdward Smith-Rowland <emsr@gcc.gnu.org>
Thu, 10 Jul 2014 22:26:50 +0000 (22:26 +0000)
2014-07-10  Edward Smith-Rowland  <3dw4rd@verizon.net>
    Jonathan Wakely  <jwakely@redhat.com>

PR CPP/61389
* macro.c (_cpp_arguments_ok, parse_params, create_iso_definition):
Warning messages mention C++11 in c++ mode and C99 in c mode.
* lex.c (lex_identifier_intern, lex_identifier): Ditto

Co-Authored-By: Jonathan Wakely <jwakely@redhat.com>
From-SVN: r212441

libcpp/ChangeLog
libcpp/lex.c
libcpp/macro.c

index f22471b229e3eff0cef063c61372df8687ea8933..c62478d6044fe08d6f0af9738e305c6e9eeb3347 100644 (file)
@@ -1,3 +1,11 @@
+2014-07-10  Edward Smith-Rowland  <3dw4rd@verizon.net>
+           Jonathan Wakely  <jwakely@redhat.com>
+
+       PR CPP/61389
+       * macro.c (_cpp_arguments_ok, parse_params, create_iso_definition):
+       Warning messages mention C++11 in c++ mode and C99 in c mode.
+       * lex.c (lex_identifier_intern, lex_identifier): Ditto
+
 2014-07-09  Edward Smith-Rowland  <3dw4rd@verizon.net>
 
        PR c++/58155 - -Wliteral-suffix warns about tokens which are skipped
index 9130cbcee915b87d9de97d39ac78bcc82b59cb85..7e2db64db09318190460bccf78a1e934c797cc18 100644 (file)
@@ -1175,9 +1175,16 @@ lex_identifier_intern (cpp_reader *pfile, const uchar *base)
         replacement list of a variadic macro.  */
       if (result == pfile->spec_nodes.n__VA_ARGS__
          && !pfile->state.va_args_ok)
-       cpp_error (pfile, CPP_DL_PEDWARN,
-                  "__VA_ARGS__ can only appear in the expansion"
-                  " of a C99 variadic macro");
+       {
+         if (CPP_OPTION (pfile, cplusplus))
+           cpp_error (pfile, CPP_DL_PEDWARN,
+                      "__VA_ARGS__ can only appear in the expansion"
+                      " of a C++11 variadic macro");
+         else
+           cpp_error (pfile, CPP_DL_PEDWARN,
+                      "__VA_ARGS__ can only appear in the expansion"
+                      " of a C99 variadic macro");
+       }
 
       /* For -Wc++-compat, warn about use of C++ named operators.  */
       if (result->flags & NODE_WARN_OPERATOR)
@@ -1255,9 +1262,16 @@ lex_identifier (cpp_reader *pfile, const uchar *base, bool starts_ucn,
         replacement list of a variadic macro.  */
       if (result == pfile->spec_nodes.n__VA_ARGS__
          && !pfile->state.va_args_ok)
-       cpp_error (pfile, CPP_DL_PEDWARN,
-                  "__VA_ARGS__ can only appear in the expansion"
-                  " of a C99 variadic macro");
+       {
+         if (CPP_OPTION (pfile, cplusplus))
+           cpp_error (pfile, CPP_DL_PEDWARN,
+                      "__VA_ARGS__ can only appear in the expansion"
+                      " of a C++11 variadic macro");
+         else
+           cpp_error (pfile, CPP_DL_PEDWARN,
+                      "__VA_ARGS__ can only appear in the expansion"
+                      " of a C99 variadic macro");
+       }
 
       /* For -Wc++-compat, warn about use of C++ named operators.  */
       if (result->flags & NODE_WARN_OPERATOR)
index 407eb8c7767611c8bb14da7cd7bf6c65aedd1250..ab4817e8af60c599d1e5d64b056dcc15c7358f98 100644 (file)
@@ -713,19 +713,27 @@ _cpp_arguments_ok (cpp_reader *pfile, cpp_macro *macro, const cpp_hashnode *node
 
   if (argc < macro->paramc)
     {
-      /* As an extension, a rest argument is allowed to not appear in
+      /* As an extension, variadic arguments are allowed to not appear in
         the invocation at all.
         e.g. #define debug(format, args...) something
         debug("string");
 
-        This is exactly the same as if there had been an empty rest
-        argument - debug("string", ).  */
+        This is exactly the same as if an empty variadic list had been
+        supplied - debug("string", ).  */
 
       if (argc + 1 == macro->paramc && macro->variadic)
        {
          if (CPP_PEDANTIC (pfile) && ! macro->syshdr)
-           cpp_error (pfile, CPP_DL_PEDWARN,
-                      "ISO C99 requires rest arguments to be used");
+           {
+             if (CPP_OPTION (pfile, cplusplus))
+               cpp_error (pfile, CPP_DL_PEDWARN,
+                          "ISO C++11 requires at least one argument "
+                          "for the \"...\" in a variadic macro");
+             else
+               cpp_error (pfile, CPP_DL_PEDWARN,
+                          "ISO C99 requires at least one argument "
+                          "for the \"...\" in a variadic macro");
+           }
          return true;
        }
 
@@ -1748,12 +1756,20 @@ replace_args (cpp_reader *pfile, cpp_hashnode *node, cpp_macro *macro,
               && ! CPP_OPTION (pfile, c99)
               && ! cpp_in_system_header (pfile))
        {
-         cpp_error (pfile, CPP_DL_PEDWARN,
-                    "invoking macro %s argument %d: "
-                    "empty macro arguments are undefined"
-                    " in ISO C90 and ISO C++98",
-                    NODE_NAME (node),
-                    src->val.macro_arg.arg_no);
+         if (CPP_OPTION (pfile, cplusplus))
+           cpp_error (pfile, CPP_DL_PEDWARN,
+                      "invoking macro %s argument %d: "
+                      "empty macro arguments are undefined"
+                      " in ISO C++98",
+                      NODE_NAME (node),
+                      src->val.macro_arg.arg_no);
+         else
+           cpp_error (pfile, CPP_DL_PEDWARN,
+                      "invoking macro %s argument %d: "
+                      "empty macro arguments are undefined"
+                      " in ISO C90",
+                      NODE_NAME (node),
+                      src->val.macro_arg.arg_no);
        }
 
       /* Avoid paste on RHS (even case count == 0).  */
@@ -2798,14 +2814,27 @@ parse_params (cpp_reader *pfile, cpp_macro *macro)
              if (! CPP_OPTION (pfile, c99)
                  && CPP_OPTION (pfile, cpp_pedantic)
                  && CPP_OPTION (pfile, warn_variadic_macros))
-               cpp_pedwarning
-                  (pfile, CPP_W_VARIADIC_MACROS,
-                  "anonymous variadic macros were introduced in C99");
+               {
+                 if (CPP_OPTION (pfile, cplusplus))
+                   cpp_pedwarning
+                       (pfile, CPP_W_VARIADIC_MACROS,
+                       "anonymous variadic macros were introduced in C++11");
+                 else
+                   cpp_pedwarning
+                       (pfile, CPP_W_VARIADIC_MACROS,
+                       "anonymous variadic macros were introduced in C99");
+               }
            }
          else if (CPP_OPTION (pfile, cpp_pedantic)
                   && CPP_OPTION (pfile, warn_variadic_macros))
-           cpp_pedwarning (pfile, CPP_W_VARIADIC_MACROS,
+           {
+             if (CPP_OPTION (pfile, cplusplus))
+               cpp_pedwarning (pfile, CPP_W_VARIADIC_MACROS,
+                           "ISO C++ does not permit named variadic macros");
+             else
+               cpp_pedwarning (pfile, CPP_W_VARIADIC_MACROS,
                            "ISO C does not permit named variadic macros");
+           }
 
          /* We're at the end, and just expect a closing parenthesis.  */
          token = _cpp_lex_token (pfile);
@@ -2894,11 +2923,17 @@ create_iso_definition (cpp_reader *pfile, cpp_macro *macro)
   else if (ctoken->type != CPP_EOF && !(ctoken->flags & PREV_WHITE))
     {
       /* While ISO C99 requires whitespace before replacement text
-        in a macro definition, ISO C90 with TC1 allows there characters
-        from the basic source character set.  */
+        in a macro definition, ISO C90 with TC1 allows characters
+        from the basic source character set there.  */
       if (CPP_OPTION (pfile, c99))
-       cpp_error (pfile, CPP_DL_PEDWARN,
-                  "ISO C99 requires whitespace after the macro name");
+       {
+         if (CPP_OPTION (pfile, cplusplus))
+           cpp_error (pfile, CPP_DL_PEDWARN,
+                      "ISO C++11 requires whitespace after the macro name");
+         else
+           cpp_error (pfile, CPP_DL_PEDWARN,
+                      "ISO C99 requires whitespace after the macro name");
+       }
       else
        {
          int warntype = CPP_DL_WARNING;
@@ -3134,8 +3169,8 @@ _cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node)
       && ustrcmp (NODE_NAME (node), (const uchar *) "__STDC_FORMAT_MACROS")
       /* __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS are mentioned
         in the C standard, as something that one must use in C++.
-        However DR#593 indicates that these aren't actually mentioned
-        in the C++ standard.  We special-case them anyway.  */
+        However DR#593 and C++11 indicate that they play no role in C++.
+        We special-case them anyway.  */
       && ustrcmp (NODE_NAME (node), (const uchar *) "__STDC_LIMIT_MACROS")
       && ustrcmp (NODE_NAME (node), (const uchar *) "__STDC_CONSTANT_MACROS"))
     node->flags |= NODE_WARN;