diff options
author | Tom Tromey <tom@tromey.com> | 2017-09-17 20:36:41 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2017-09-27 07:51:33 -0600 |
commit | a9bbfbd85fddfea2db30810c33c4bb130a2ef773 (patch) | |
tree | e8e03252fbd330c15075d6d2a45520985e88c65f /gdb/testsuite | |
parent | 19485196044b2521af979f1e5c4a89bfb90fba0b (diff) | |
download | gdb-a9bbfbd85fddfea2db30810c33c4bb130a2ef773.zip gdb-a9bbfbd85fddfea2db30810c33c4bb130a2ef773.tar.gz gdb-a9bbfbd85fddfea2db30810c33c4bb130a2ef773.tar.bz2 |
Add support for __VA_OPT__
C++2a adds a "__VA_OPT__" feature that can be used to control the
pesky "," emission when the final (variable) argument of a variadic
macro is empty. This patch implements this feature for gdb. (A patch
to implement it for gcc is pending.)
gdb/ChangeLog
2017-09-27 Tom Tromey <tom@tromey.com>
* macroexp.c (get_next_token_for_substitution): New function.
(substitute_args): Call it. Check for __VA_OPT__.
gdb/testsuite/ChangeLog
2017-09-27 Tom Tromey <tom@tromey.com>
* gdb.base/macscp.exp: Add __VA_OPT__ tests.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/macscp.exp | 64 |
2 files changed, 68 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 4b6cb80..4348e76 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-09-27 Tom Tromey <tom@tromey.com> + + * gdb.base/macscp.exp: Add __VA_OPT__ tests. + 2017-09-26 Thomas Preud'homme <thomas.preudhomme@arm.com> Pedro Alves <palves@redhat.com> diff --git a/gdb/testsuite/gdb.base/macscp.exp b/gdb/testsuite/gdb.base/macscp.exp index 54b5ab2..c5cd899 100644 --- a/gdb/testsuite/gdb.base/macscp.exp +++ b/gdb/testsuite/gdb.base/macscp.exp @@ -620,6 +620,18 @@ gdb_test_no_output "macro define va_gnu(args...) varfunc (fixedarg, args)" \ gdb_test_no_output "macro define va2_gnu(args...) varfunc (fixedarg, ## args)" \ "define fourth varargs helper" +gdb_test_no_output \ + "macro define va3_cxx2a(x, ...) varfunc (x __VA_OPT__(,) __VA_ARGS__)" \ + "define fifth varargs helper" + +gdb_test_no_output \ + "macro define va4_cxx2a(x, ...) varfunc (x __VA_OPT__(, __VA_ARGS__))" \ + "define sixth varargs helper" + +gdb_test_no_output \ + "macro define va5_cxx2a(x, ...) varfunc (x __VA_OPT__(,) __VA_OPT__(__VA_ARGS__))" \ + "define seventh varargs helper" + gdb_test "macro expand va_c99(one, two, three)" \ "expands to: *varfunc \\(fixedarg, *one, two, three\\)" \ "c99 varargs expansion" @@ -644,6 +656,58 @@ gdb_test "macro expand va2_gnu()" \ "expands to: *varfunc \\(fixedarg\\)" \ "gnu varargs expansion special splicing without an argument" +gdb_test "macro expand va3_cxx2a(23)" \ + "expands to: *varfunc \\(23 \\)" \ + "C++2a __VA_OPT__ handling without variable argument" + +gdb_test "macro expand va3_cxx2a(23, 24, 25)" \ + "expands to: *varfunc \\(23, 24, 25\\)" \ + "C++2a __VA_OPT__ handling with variable argument" + +gdb_test "macro expand va4_cxx2a(23, 24, 25)" \ + "expands to: *varfunc \\(23, 24, 25\\)" \ + "C++2a __VA_OPT__ conditional __VA_ARGS__ handling with variable argument" + +gdb_test "macro expand va4_cxx2a(23)" \ + "expands to: *varfunc \\(23\\)" \ + "C++2a __VA_OPT__ conditional __VA_ARGS__ handling without variable argument" + +gdb_test "macro expand va5_cxx2a(23, 24, 25)" \ + "expands to: *varfunc \\(23,24, 25\\)" \ + "C++2a double __VA_OPT__ conditional __VA_ARGS__ handling with variable argument" + +gdb_test "macro expand va5_cxx2a(23)" \ + "expands to: *varfunc \\(23\\)" \ + "C++2a double __VA_OPT__ conditional __VA_ARGS__ handling without variable argument" + +gdb_test_no_output \ + "macro define badopt1(x, ...) __VA_OPT__) x" \ + "define first invalid varargs helper" +gdb_test "macro expand badopt1(5)" \ + "__VA_OPT__ must be followed by an open parenthesis" \ + "__VA_OPT__ without open paren" + +gdb_test_no_output \ + "macro define badopt2(x, ...) __VA_OPT__(__VA_OPT__(,)) x" \ + "define second invalid varargs helper" +gdb_test "macro expand badopt2(5)" \ + "__VA_OPT__ cannot appear inside __VA_OPT__" \ + "__VA_OPT__ inside __VA_OPT__" + +gdb_test_no_output \ + "macro define badopt3(x) __VA_OPT__" \ + "define third invalid varargs helper" +gdb_test "macro expand badopt3(5)" \ + "__VA_OPT__ is only valid in a variadic macro" \ + "__VA_OPT__ not in variadic macro" + +gdb_test_no_output \ + "macro define badopt4(x, ...) __VA_OPT__(x" \ + "define fourth invalid varargs helper" +gdb_test "macro expand badopt4(5)" \ + "Unterminated __VA_OPT__" \ + "__VA_OPT__ without closing paren" + # Stringification tests. gdb_test_no_output "macro define str(x) #x" \ |