Implement __VA_OPT__
commit86136db8efde2401b066fee95c546365b75dce2e
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Nov 2017 20:17:42 +0000 (13 20:17 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Nov 2017 20:17:42 +0000 (13 20:17 +0000)
treed94251e8c98cb3a0a9bfd711707dea469e857c6b
parentf9afdf2410c19c8678a4cb54edfafda9f3fd15ca
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__.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@254707 138bc75d-0d04-0410-961f-82ee72b054a4
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