Use of __VA_OPT__ can break the token-based policy when those optional tokens do not come from arguments. $ cat > foo.c __VERSION__ #define foo(...) __VA_OPT__(foo)__VA_OPT__(bar) foo(dummy) $ gcc -E foo.c # 1 "foo.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<command-line>" 2 # 1 "foo.c" "8.0.0 20180105 (experimental)" foobar
Author: jason Date: Thu Feb 15 17:43:01 2018 New Revision: 257696 URL: https://gcc.gnu.org/viewcvs?rev=257696&root=gcc&view=rev Log: PR preprocessor/83063 - __VA_OPT__ and ## PR preprocessor/83708 * macro.c (vaopt_state): Reorder m_last_was_paste before m_state. (vaopt_state::vaopt_state): Adjust. (vaopt_state::update_flags): Add BEGIN and END. (vaopt_state::update): Return them. (copy_paste_flag): Factor out of replace_args. (last_token_is): New. (replace_args): Handle BEGIN and END. Avoid padding there. (tokens_buff_last_token_ptr): Return NULL if no tokens. Added: trunk/gcc/testsuite/c-c++-common/cpp/va-opt-2.c trunk/gcc/testsuite/c-c++-common/cpp/va-opt-3.c Modified: trunk/libcpp/ChangeLog trunk/libcpp/macro.c
Fixed.