Skip to content

Commit 7d167f4

Browse files
authored
[C++] Expose nullptr_t from stddef.h in C++ mode (#154599)
The C++ standard requires stddef.h to declare all of its contents in the global namespace. We were only doing it when trying to be compatible with Microsoft extensions. Now we expose in C++11 or later, in addition to exposing it in Microsoft extensions mode. Fixes #154577
1 parent f09ac1b commit 7d167f4

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ Bug Fixes in This Version
229229
cast chain. (#GH149967).
230230
- Fixed a crash with incompatible pointer to integer conversions in designated
231231
initializers involving string literals. (#GH154046)
232+
- Clang's ``<stddef.h>`` now properly declares ``nullptr_t`` in C++ mode. (#GH154577).
232233

233234
Bug Fixes to Compiler Builtins
234235
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

clang/lib/Headers/__stddef_nullptr_t.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
#define _NULLPTR_T
1717

1818
#ifdef __cplusplus
19-
#if defined(_MSC_EXTENSIONS) && defined(_NATIVE_NULLPTR_SUPPORTED)
19+
#if __cplusplus >= 201103L || \
20+
(defined(_MSC_EXTENSIONS) && defined(_NATIVE_NULLPTR_SUPPORTED))
2021
namespace std {
2122
typedef decltype(nullptr) nullptr_t;
2223
}

clang/test/Headers/stddefneeds.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.9.0 -verify -Wsentinel -std=c++11 %s
2+
// RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.9.0 -verify=old,expected -Wsentinel -std=c++98 %s
23

34
ptrdiff_t p0; // expected-error{{unknown}}
45
size_t s0; // expected-error{{unknown}}
56
void* v0 = NULL; // expected-error{{undeclared}}
67
wint_t w0; // expected-error{{unknown}}
78
max_align_t m0; // expected-error{{unknown}}
9+
nullptr_t n0; // expected-error {{unknown}}
810

911
#define __need_ptrdiff_t
1012
#include <stddef.h>
@@ -14,6 +16,7 @@ size_t s1; // expected-error{{unknown}}
1416
void* v1 = NULL; // expected-error{{undeclared}}
1517
wint_t w1; // expected-error{{unknown}}
1618
max_align_t m1; // expected-error{{unknown}}
19+
nullptr_t n1; // expected-error{{unknown}}
1720

1821
#define __need_size_t
1922
#include <stddef.h>
@@ -23,6 +26,16 @@ size_t s2;
2326
void* v2 = NULL; // expected-error{{undeclared}}
2427
wint_t w2; // expected-error{{unknown}}
2528
max_align_t m2; // expected-error{{unknown}}
29+
nullptr_t n2; // expected-error{{unknown}}
30+
31+
#define __need_nullptr_t
32+
#include <stddef.h>
33+
ptrdiff_t p6;
34+
size_t s6;
35+
void* v6 = NULL; // expected-error{{undeclared}}
36+
wint_t w6; // expected-error{{unknown}}
37+
max_align_t m6; // expected-error{{unknown}}
38+
nullptr_t n6; // old-error{{unknown}}
2639

2740
#define __need_NULL
2841
#include <stddef.h>
@@ -32,6 +45,16 @@ size_t s3;
3245
void* v3 = NULL;
3346
wint_t w3; // expected-error{{unknown}}
3447
max_align_t m3; // expected-error{{unknown}}
48+
nullptr_t n3; // old-error{{unknown}}
49+
50+
#define __need_max_align_t
51+
#include <stddef.h>
52+
ptrdiff_t p7;
53+
size_t s7;
54+
void* v7 = NULL;
55+
wint_t w7; // expected-error{{unknown}}
56+
max_align_t m7;
57+
nullptr_t n7; // old-error{{unknown}}
3558

3659
// Shouldn't bring in wint_t by default:
3760
#include <stddef.h>
@@ -41,6 +64,7 @@ size_t s4;
4164
void* v4 = NULL;
4265
wint_t w4; // expected-error{{unknown}}
4366
max_align_t m4;
67+
nullptr_t n4; // old-error{{unknown}}
4468

4569
#define __need_wint_t
4670
#include <stddef.h>
@@ -50,7 +74,7 @@ size_t s5;
5074
void* v5 = NULL;
5175
wint_t w5;
5276
max_align_t m5;
53-
77+
nullptr_t n5; // old-error{{unknown}}
5478

5579
// linux/stddef.h does something like this for cpp files:
5680
#undef NULL

0 commit comments

Comments
 (0)