From 49f161b64635a396a58dddc9fd09d115e98181bc Mon Sep 17 00:00:00 2001 From: emsr Date: Thu, 10 Jul 2014 22:26:50 +0000 Subject: [PATCH] 2014-07-10 Edward Smith-Rowland <3dw4rd@verizon.net> Jonathan Wakely 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 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212441 138bc75d-0d04-0410-961f-82ee72b054a4 --- libcpp/ChangeLog | 8 ++++++ libcpp/lex.c | 26 ++++++++++++++----- libcpp/macro.c | 77 ++++++++++++++++++++++++++++++++++++++++---------------- 3 files changed, 84 insertions(+), 27 deletions(-) diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index f22471b229e..c62478d6044 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,11 @@ +2014-07-10 Edward Smith-Rowland <3dw4rd@verizon.net> + Jonathan Wakely + + 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 diff --git a/libcpp/lex.c b/libcpp/lex.c index 9130cbcee91..7e2db64db09 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -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) diff --git a/libcpp/macro.c b/libcpp/macro.c index 407eb8c7767..ab4817e8af6 100644 --- a/libcpp/macro.c +++ b/libcpp/macro.c @@ -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; -- 2.11.4.GIT