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

Reply via email to