c++: Partially implement P1042R1: __VA_OPT__ wording clarifications [PR92319]
authorJakub Jelinek <jakub@redhat.com>
Fri, 14 Feb 2020 08:04:14 +0000 (09:04 +0100)
committerJakub Jelinek <jakub@redhat.com>
Fri, 14 Feb 2020 08:04:14 +0000 (09:04 +0100)
commite235031d490e8ed2aa0bc229694975493fd58977
tree8eb58009c5cfb5ea8faf3a5b76d1f45c3b8101d0
parentc595ad44fa8023f6a7e128e11e4932467fa49ec1
c++: Partially implement P1042R1: __VA_OPT__ wording clarifications [PR92319]

I've noticed we claim in cxx-status.html that we implement P1042R1,
but it seems we don't implement any of the changes from there.
The following patch implements just the change that __VA_OPT__ determines
whether to expand to nothing or the enclosed tokens no longer based on
whether there were any tokens passed to __VA_ARGS__, but whether __VA_ARGS__
expands to any tokens (from testing apparently it has to be non-CPP_PADDING
tokens).

I'm afraid I'm completely lost about the padding preservation/removal
changes that are also in the paper, so haven't touched that part.

2020-02-14  Jakub Jelinek  <jakub@redhat.com>

Partially implement P1042R1: __VA_OPT__ wording clarifications
PR preprocessor/92319
* macro.c (expand_arg): Move declarations before vaopt_state
definition.
(class vaopt_state): Move enum update_type definition earlier.  Remove
m_allowed member, add m_arg and m_update members.
(vaopt_state::vaopt_state): Change last argument from bool any_args
to macro_arg *arg, initialize m_arg and m_update instead of m_allowed.
(vaopt_state::update): When bumping m_state from 1 to 2 and m_update
is ERROR, determine if __VA_ARGS__ expansion has any non-CPP_PADDING
tokens and set m_update to INCLUDE if it has any, DROP otherwise.
Return m_update instead of m_allowed ? INCLUDE : DROP in m_state >= 2.
(replace_args, create_iso_definition): Adjust last argument to
vaopt_state ctor.

* c-c++-common/cpp/va-opt-4.c: New test.
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/cpp/va-opt-4.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/macro.c