Author: Aaron Ballman Date: 2024-06-24T10:52:17-04:00 New Revision: b012ab01cb39e440a38dad5d7dd71b419480264b
URL: https://github.com/llvm/llvm-project/commit/b012ab01cb39e440a38dad5d7dd71b419480264b DIFF: https://github.com/llvm/llvm-project/commit/b012ab01cb39e440a38dad5d7dd71b419480264b.diff LOG: [C23] Claim conformance to WG14 N3033 Clang has implemented __VA_OPT__ since Clang 12. Added: clang/test/C/C2x/n3033.c clang/test/C/C2x/n3033_2.c Modified: clang/www/c_status.html Removed: ################################################################################ diff --git a/clang/test/C/C2x/n3033.c b/clang/test/C/C2x/n3033.c new file mode 100644 index 0000000000000..bf249a37facb3 --- /dev/null +++ b/clang/test/C/C2x/n3033.c @@ -0,0 +1,50 @@ +// RUN: %clang_cc1 -std=c23 -E %s | FileCheck %s + +/* WG14 N3033: Clang 12 + * Comma ommission and deletion (__VA_OPT__) + */ + +#define F(...) f(0 __VA_OPT__(,) __VA_ARGS__) +#define G(X, ...) f(0, X __VA_OPT__(,) __VA_ARGS__) +#define SDEF(sname, ...) S sname __VA_OPT__(= { __VA_ARGS__ }) +#define EMP + +F(a, b, c) // replaced by f(0, a, b, c) +// CHECK: f(0 , a, b, c) +F() // replaced by f(0) +// CHECK: f(0 ) +F(EMP) // replaced by f(0) +// CHECK: f(0 ) + +G(a, b, c) // replaced by f(0, a, b, c) +// CHECK: f(0, a , b, c) +G(a, ) // replaced by f(0, a) +// CHECK: f(0, a ) +G(a) // replaced by f(0, a) +// CHECK: f(0, a ) + +SDEF(foo); // replaced by S foo; +// CHECK: S foo ; +SDEF(bar, 1, 2); // replaced by S bar = { 1, 2 }; +// CHECK: S bar = { 1, 2 }; + +//#define H1(X, ...) X __VA_OPT__(##) __VA_ARGS__ // error: ## may not appear at the beginning of a replacement list (6.10.3.3) + +#define H2(X, Y, ...) __VA_OPT__(X ## Y,) __VA_ARGS__ +H2(a, b, c, d) // replaced by ab, c, d +// CHECK: ab, c, d + +#define H3(X, ...) #__VA_OPT__(X##X X##X) +H3(, 0) // replaced by "" +// CHECK: "" + +#define H4(X, ...) __VA_OPT__(a X ## X) ## b +H4(, 1) // replaced by a b +// CHECK: a b + +#define H5A(...) __VA_OPT__()/**/__VA_OPT__() +#define H5B(X) a ## X ## b +#define H5C(X) H5B(X) +H5C(H5A()) // replaced by ab +// CHECK: ab + diff --git a/clang/test/C/C2x/n3033_2.c b/clang/test/C/C2x/n3033_2.c new file mode 100644 index 0000000000000..5da206658690c --- /dev/null +++ b/clang/test/C/C2x/n3033_2.c @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c23 -verify %s + +#define H1(X, ...) X __VA_OPT__(##) __VA_ARGS__ // expected-error {{'##' cannot appear at start of __VA_OPT__ argument}} + diff --git a/clang/www/c_status.html b/clang/www/c_status.html index 6b375a6b7999d..f6a92d94874a5 100644 --- a/clang/www/c_status.html +++ b/clang/www/c_status.html @@ -1184,7 +1184,7 @@ <h2 id="c2x">C23 implementation status</h2> <tr> <td>Comma ommission and deletion (__VA_OPT__)</td> <td><a href="https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3033.htm">N3033</a></td> - <td class="unknown" align="center">Unknown</td> + <td class="full" align="center">Clang 12</td> </tr> <tr> <td>Underspecified object definitions</td> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits