From 933b146f0aac96b05cd5a7518929843f72c8b64a Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 19 Nov 2024 21:31:24 +0000 Subject: [PATCH] c: Do not register nullptr_t built-in type [PR114869] As reported in bug 114869, the C front end wrongly creates nullptr_t as a built-in typedef; it should only be defined in . 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 --- gcc/c/c-decl.cc | 2 +- gcc/testsuite/gcc.dg/c11-nullptr-2.c | 5 +++++ gcc/testsuite/gcc.dg/c11-nullptr-3.c | 7 +++++++ gcc/testsuite/gcc.dg/c23-nullptr-5.c | 2 +- gcc/testsuite/gcc.dg/c23-nullptr-7.c | 5 +++++ 5 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/c11-nullptr-2.c create mode 100644 gcc/testsuite/gcc.dg/c11-nullptr-3.c create mode 100644 gcc/testsuite/gcc.dg/c23-nullptr-7.c diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 1128d72ccb0..96bfe9290fd 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 00000000000..3b37b11ed98 --- /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 00000000000..5abb082043c --- /dev/null +++ b/gcc/testsuite/gcc.dg/c11-nullptr-3.c @@ -0,0 +1,7 @@ +/* Test there is no nullptr_t in for C11. */ +/* { dg-do compile } */ +/* { dg-options "-std=c11 -pedantic-errors" } */ + +#include + +int nullptr_t; diff --git a/gcc/testsuite/gcc.dg/c23-nullptr-5.c b/gcc/testsuite/gcc.dg/c23-nullptr-5.c index 54266af70fb..f708ec2cfc0 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 00000000000..2692e30ea2a --- /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;