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
29 lines
1.2 KiB
C
29 lines
1.2 KiB
C
/* { dg-do preprocess }*/
|
|
/* { dg-options "-std=gnu99" { target c } } */
|
|
/* { dg-options "-std=c++2a" { target c++ } } */
|
|
|
|
#define ERR1(x) __VA_OPT__ /* { dg-warning "__VA_OPT__ can only appear" } */
|
|
#define ERR2(x) __VA_OPT__( /* { dg-warning "can only appear" } */
|
|
#define ERR3(x) __VA_OPT__() /* { dg-warning "can only appear" } */
|
|
|
|
#define ERR4(x,...) __VA_OPT__ /* { dg-error "unterminated __VA_OPT__" } */
|
|
#define ERR5(x,...) __VA_OPT__( /* { dg-error "unterminated" } */
|
|
#define ERR6(x,...) __VA_OPT__(() /* { dg-error "unterminated" } */
|
|
|
|
#define ERR7(x,...) __VA_OPT__(__VA_OPT__) /* { dg-error "may not appear" } */
|
|
#define ERR7(x,...) __VA_OPT__(__VA_OPT__()) /* { dg-error "may not appear" } */
|
|
|
|
#define ERR8(x, y,...) x __VA_OPT__(##) y /* { dg-error "either end" } */
|
|
#define ERR9(x, y,...) x __VA_OPT__(x ##) y /* { dg-error "either end" } */
|
|
#define ERRA(x, y,...) x x __VA_OPT__(## y) /* { dg-error "either end" } */
|
|
|
|
#define ERRB __VA_OPT__ /* { dg-warning "can only appear" } */
|
|
#define ERRC(__VA_OPT__) x /* { dg-warning "can only appear" } */
|
|
|
|
__VA_OPT__ /* { dg-warning "can only appear" } */
|
|
|
|
#define ERRD(x)
|
|
ERRD(__VA_OPT__) /* { dg-warning "can only appear" } */
|
|
|
|
#define __VA_OPT__ /* { dg-warning "can only appear" } */
|