As reported in bug 114869, the C front end wrongly creates nullptr_t as a built-in typedef; it should only be defined in <stddef.h>. While the type node needs a name for debug info generation, it doesn't need to be a valid identifier; use typeof (nullptr) instead, similar to how the C++ front end uses decltype(nullptr) for this purpose.
Bootstrapped with no regressions for x86_64-pc-linux-gnu. PR c/114869 gcc/c/ * c-decl.cc (c_init_decl_processing): Register nullptr_type_node as typeof (nullptr) not nullptr_t. gcc/testsuite/ * gcc.dg/c23-nullptr-5.c: Use typeof (nullptr) not nullptr_t. * gcc.dg/c11-nullptr-2.c, gcc.dg/c11-nullptr-3.c, gcc.dg/c23-nullptr-7.c: New tests diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 1128d72ccb03..96bfe9290fd9 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -4799,7 +4799,7 @@ c_init_decl_processing (void) boolean_type_node)); /* C-specific nullptr initialization. */ - record_builtin_type (RID_MAX, "nullptr_t", nullptr_type_node); + record_builtin_type (RID_MAX, "typeof (nullptr)", nullptr_type_node); /* The size and alignment of nullptr_t is the same as for a pointer to character type. */ SET_TYPE_ALIGN (nullptr_type_node, GET_MODE_ALIGNMENT (ptr_mode)); diff --git a/gcc/testsuite/gcc.dg/c11-nullptr-2.c b/gcc/testsuite/gcc.dg/c11-nullptr-2.c new file mode 100644 index 000000000000..3b37b11ed986 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c11-nullptr-2.c @@ -0,0 +1,5 @@ +/* Test there is no nullptr_t built-in typedef. Bug 114869. */ +/* { dg-do compile } */ +/* { dg-options "-std=c11 -pedantic-errors" } */ + +int nullptr_t; diff --git a/gcc/testsuite/gcc.dg/c11-nullptr-3.c b/gcc/testsuite/gcc.dg/c11-nullptr-3.c new file mode 100644 index 000000000000..5abb082043cc --- /dev/null +++ b/gcc/testsuite/gcc.dg/c11-nullptr-3.c @@ -0,0 +1,7 @@ +/* Test there is no nullptr_t in <stddef.h> for C11. */ +/* { dg-do compile } */ +/* { dg-options "-std=c11 -pedantic-errors" } */ + +#include <stddef.h> + +int nullptr_t; diff --git a/gcc/testsuite/gcc.dg/c23-nullptr-5.c b/gcc/testsuite/gcc.dg/c23-nullptr-5.c index 54266af70fb3..f708ec2cfc08 100644 --- a/gcc/testsuite/gcc.dg/c23-nullptr-5.c +++ b/gcc/testsuite/gcc.dg/c23-nullptr-5.c @@ -3,7 +3,7 @@ /* { dg-options "-std=c23 -pedantic-errors" } */ int i; -nullptr_t fn () { ++i; return nullptr; } +typeof (nullptr) fn () { ++i; return nullptr; } int main () diff --git a/gcc/testsuite/gcc.dg/c23-nullptr-7.c b/gcc/testsuite/gcc.dg/c23-nullptr-7.c new file mode 100644 index 000000000000..2692e30ea2ad --- /dev/null +++ b/gcc/testsuite/gcc.dg/c23-nullptr-7.c @@ -0,0 +1,5 @@ +/* Test there is no nullptr_t built-in typedef. Bug 114869. */ +/* { dg-do compile } */ +/* { dg-options "-std=c23 -pedantic-errors" } */ + +int nullptr_t; -- Joseph S. Myers josmy...@redhat.com