aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2025-01-21 09:14:01 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2025-01-21 09:14:01 +0100
commit2a6816883107ee4a4aabb43763ce079512f3f0f8 (patch)
tree1ca8b16a1f41cf8dc3553bfe36cc7602c5a23bd6 /gcc/c
parent843ca8a964bcfeae72d9d48e2dd549fa818120e3 (diff)
downloadgcc-2a6816883107ee4a4aabb43763ce079512f3f0f8.zip
gcc-2a6816883107ee4a4aabb43763ce079512f3f0f8.tar.gz
gcc-2a6816883107ee4a4aabb43763ce079512f3f0f8.tar.bz2
c, c++: Return 1 for __has_builtin(__builtin_va_arg) and __has_builtin(__builtin_c23_va_start)
The Linux kernel uses its own copy of stdarg.h. Now, before GCC 15, our stdarg.h had #if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L #define va_start(v, ...) __builtin_va_start(v, 0) #else #define va_start(v,l) __builtin_va_start(v,l) #endif va_start definition but GCC 15 has: #if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L #define va_start(...) __builtin_c23_va_start(__VA_ARGS__) #else #define va_start(v,l) __builtin_va_start(v,l) #endif I wanted to suggest to the kernel people during their porting to C23 that they'd better use C23 compatible va_start macro definition, but to make it portable, I think they really want something like #if defined __STDC_VERSION__ && __STDC_VERSION__ > 201710L #define va_start(v, ...) __builtin_va_start(v, 0) #ifdef __has_builtin #if __has_builtin(__builtin_c23_va_start) #undef va_start #define va_start(...) __builtin_c23_va_start(__VA_ARGS__) #endif #else #define va_start(v,l) __builtin_va_start(v,l) #endif or so (or with >= 202311L), as GCC 13-14 and clang don't support __builtin_c23_va_start (yet?) and one gets better user experience with that. Except it seems __has_builtin(__builtin_c23_va_start) doesn't actually work, it works for most of the stdarg.h __builtin_va_*, doesn't work for __builtin_va_arg (neither C nor C++) and didn't work for __builtin_c23_va_start if it was available. The following patch wires __has_builtin for those. 2025-01-21 Jakub Jelinek <jakub@redhat.com> gcc/c/ * c-decl.cc (names_builtin_p): Return 1 for RID_C23_VA_START and RID_VA_ARG. gcc/cp/ * cp-objcp-common.cc (names_builtin_p): Return 1 for RID_VA_ARG. gcc/testsuite/ * c-c++-common/cpp/has-builtin-4.c: New test.
Diffstat (limited to 'gcc/c')
-rw-r--r--gcc/c/c-decl.cc2
1 files changed, 2 insertions, 0 deletions
diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
index 314b118..68d331b 100644
--- a/gcc/c/c-decl.cc
+++ b/gcc/c/c-decl.cc
@@ -11804,6 +11804,8 @@ names_builtin_p (const char *name)
case RID_CHOOSE_EXPR:
case RID_OFFSETOF:
case RID_TYPES_COMPATIBLE_P:
+ case RID_C23_VA_START:
+ case RID_VA_ARG:
return 1;
default:
break;