aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-02-14 09:04:14 +0100
committerJakub Jelinek <jakub@redhat.com>2020-02-14 09:04:14 +0100
commite235031d490e8ed2aa0bc229694975493fd58977 (patch)
tree8eb58009c5cfb5ea8faf3a5b76d1f45c3b8101d0 /gcc
parentc595ad44fa8023f6a7e128e11e4932467fa49ec1 (diff)
downloadgcc-e235031d490e8ed2aa0bc229694975493fd58977.zip
gcc-e235031d490e8ed2aa0bc229694975493fd58977.tar.gz
gcc-e235031d490e8ed2aa0bc229694975493fd58977.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/c-c++-common/cpp/va-opt-4.c20
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a262bdd..e42751e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-14 Jakub Jelinek <jakub@redhat.com>
+
+ Partially implement P1042R1: __VA_OPT__ wording clarifications
+ PR preprocessor/92319
+ * c-c++-common/cpp/va-opt-4.c: New test.
+
2020-02-13 Jakub Jelinek <jakub@redhat.com>
PR c/93576
diff --git a/gcc/testsuite/c-c++-common/cpp/va-opt-4.c b/gcc/testsuite/c-c++-common/cpp/va-opt-4.c
new file mode 100644
index 0000000..57241bc
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/cpp/va-opt-4.c
@@ -0,0 +1,20 @@
+/* PR preprocessor/92319 */
+/* { dg-do preprocess } */
+/* { dg-options "-std=gnu99" { target c } } */
+/* { dg-options "-std=c++2a" { target c++ } } */
+
+#define f1(...) b##__VA_OPT__(c)
+#define e
+#define e2 e
+#define e3 1
+#define e5 e3
+t1 f1 (e);
+/* { dg-final { scan-file va-opt-4.i "t1 b;" } } */
+t2 f1 (e2);
+/* { dg-final { scan-file va-opt-4.i "t2 b;" } } */
+t3 f1 (e3);
+/* { dg-final { scan-file va-opt-4.i "t3 bc;" } } */
+t4 f1 (e4);
+/* { dg-final { scan-file va-opt-4.i "t4 bc;" } } */
+t5 f1 (e5);
+/* { dg-final { scan-file va-opt-4.i "t5 bc;" } } */