Implement __VA_OPT__
authorTom Tromey <tom@tromey.com>
Mon, 13 Nov 2017 20:17:42 +0000 (20:17 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Mon, 13 Nov 2017 20:17:42 +0000 (20:17 +0000)
commitfb771b9dad6ef78a985353128cea48e620eb4324
treed94251e8c98cb3a0a9bfd711707dea469e857c6b
parent4d85d480272fb7331924f04534e0f5f14b60421e
Implement __VA_OPT__

This implements __VA_OPT__, a new preprocessor feature added in C++2A.
The paper can be found here:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0306r4.html

gcc/ChangeLog

        * doc/cpp.texi (Variadic Macros): Document __VA_OPT__.

gcc/testsuite/ChangeLog

        * c-c++-common/cpp/va-opt-pedantic.c: New file.
        * c-c++-common/cpp/va-opt.c: New file.
        * c-c++-common/cpp/va-opt-error.c: New file.

libcpp/ChangeLog

        * pch.c (cpp_read_state): Set n__VA_OPT__.
        * macro.c (vaopt_state): New class.
        (_cpp_arguments_ok): Check va_opt flag.
        (replace_args, create_iso_definition): Use vaopt_state.
        * lex.c (lex_identifier_intern): Possibly issue errors for
        __VA_OPT__.
        (lex_identifier): Likewise.
        (maybe_va_opt_error): New function.
        * internal.h (struct lexer_state) <va_args_ok>: Update comment.
        (struct spec_nodes) <n__VA_OPT__>: New field.
        * init.c (struct lang_flags) <va_opt>: New field.
        (lang_defaults): Add entries for C++2A.  Update all entries for
        va_opt.
        (cpp_set_lang): Initialize va_opt.
        * include/cpplib.h (struct cpp_options) <va_opt>: New field.
        * identifiers.c (_cpp_init_hashtable): Initialize n__VA_OPT__.

From-SVN: r254707
14 files changed:
gcc/ChangeLog
gcc/doc/cpp.texi
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/cpp/va-opt-error.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/cpp/va-opt-pedantic.c [new file with mode: 0644]
gcc/testsuite/c-c++-common/cpp/va-opt.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/identifiers.c
libcpp/include/cpplib.h
libcpp/init.c
libcpp/internal.h
libcpp/lex.c
libcpp/macro.c
libcpp/pch.c