Skip to content

Commit 3859239

Browse files
[libc++] stddef.h needs to #include_next for the new clang __need_ macros
clang added several __need_ macros to stddef.h that need to be added to the libc++ version as well. clang will also re-enter stddef.h to define rsize_t if __STDC_WANT_LIB_EXT1__ is set, do that in the libc++ one too.
1 parent 36713a4 commit 3859239

File tree

3 files changed

+237
-3
lines changed

3 files changed

+237
-3
lines changed

libcxx/include/stddef.h

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,27 @@
77
//
88
//===----------------------------------------------------------------------===//
99

10-
#if defined(__need_ptrdiff_t) || defined(__need_size_t) || defined(__need_wchar_t) || defined(__need_NULL) || \
11-
defined(__need_wint_t)
10+
#if defined(__need_ptrdiff_t) || defined(__need_size_t) || defined(__need_rsize_t) || defined(__need_wchar_t) || \
11+
defined(__need_NULL) || defined(__need_nullptr_t) || defined(__need_unreachable) || defined(__need_max_align_t) || \
12+
defined(__need_offsetof) || defined(__need_wint_t)
1213

1314
# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
1415
# pragma GCC system_header
1516
# endif
1617

18+
# if defined(__need_nullptr_t) && defined(__cplusplus)
19+
// stddef.h will undef __need_nullptr_t
20+
# define __cxx_need_nullptr_t
21+
#endif
22+
1723
# include_next <stddef.h>
1824

19-
#elif !defined(_LIBCPP_STDDEF_H)
25+
# ifdef __cxx_need_nullptr_t
26+
typedef decltype(nullptr) nullptr_t;
27+
# undef __cxx_need_nullptr_t
28+
# endif
29+
30+
#elif !defined(_LIBCPP_STDDEF_H) || (defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1)
2031
# define _LIBCPP_STDDEF_H
2132

2233
/*
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// This is the same test as clang/test/Headers/stddef.c, but to test the
10+
// libc++ version of stddef.h interacts properly with the clang version.
11+
12+
struct astruct { char member; };
13+
14+
ptrdiff_t p0; // expected-error{{unknown type name 'ptrdiff_t'}}
15+
size_t s0; // expected-error{{unknown type name 'size_t'}}
16+
rsize_t r0; // expected-error{{unknown type name 'rsize_t'}}
17+
wchar_t wc0; // wchar_t is a keyword in C++
18+
void *v0 = NULL; // expected-error{{use of undeclared identifier 'NULL'}}
19+
nullptr_t n0; // expected-error{{unknown type name 'nullptr_t'}}
20+
static void f0(void) { unreachable(); } // expected-error{{undeclared identifier 'unreachable'}}
21+
max_align_t m0; // expected-error{{unknown type name 'max_align_t'}}
22+
size_t o0 = offsetof(struct astruct, member); // expected-error{{unknown type name 'size_t'}} expected-error{{expected expression}} expected-error{{use of undeclared identifier 'member'}}
23+
wint_t wi0; // expected-error{{unknown type name 'wint_t'}}
24+
25+
#include <stddef.h>
26+
27+
ptrdiff_t p1;
28+
size_t s1;
29+
rsize_t r1; // expected-error{{unknown type}} expected-note@__stddef_size_t.h:*{{'size_t' declared here}}
30+
wchar_t wc1;
31+
void *v1 = NULL;
32+
nullptr_t n1;
33+
// unreachable() is declared in <utility> in C++
34+
static void f1(void) { unreachable(); } // expected-error{{undeclared identifier}}
35+
max_align_t m1;
36+
size_t o1 = offsetof(struct astruct, member);
37+
wint_t wi1; // expected-error{{unknown type}}
38+
39+
// rsize_t needs to be opted into via __STDC_WANT_LIB_EXT1__ >= 1.
40+
#define __STDC_WANT_LIB_EXT1__ 1
41+
#include <stddef.h>
42+
ptrdiff_t p2;
43+
size_t s2;
44+
rsize_t r2;
45+
wchar_t wc2;
46+
void *v2 = NULL;
47+
nullptr_t n2;
48+
static void f2(void) { unreachable(); } // expected-error{{undeclared identifier}}
49+
max_align_t m2;
50+
size_t o2 = offsetof(struct astruct, member);
51+
wint_t wi2; // expected-error{{unknown type}}
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
// This is the same test as clang/test/Headers/stddefneeds.c, but to test the
10+
// libc++ version of stddef.h interacts properly with the clang version.
11+
12+
struct astruct { char member; };
13+
14+
ptrdiff_t p0; // expected-error{{unknown type name 'ptrdiff_t'}}
15+
size_t s0; // expected-error{{unknown type name 'size_t'}}
16+
rsize_t r0; // expected-error{{unknown type name 'rsize_t'}}
17+
wchar_t wc0; // wchar_t is a keyword in C++
18+
void *v0 = NULL; // expected-error{{use of undeclared identifier 'NULL'}}
19+
nullptr_t n0; // expected-error{{unknown type name 'nullptr_t'}}
20+
static void f0(void) { unreachable(); } // expected-error{{undeclared identifier 'unreachable'}}
21+
max_align_t m0; // expected-error{{unknown type name 'max_align_t'}}
22+
size_t o0 = offsetof(struct astruct, member); // expected-error{{unknown type name 'size_t'}} expected-error{{expected expression}} expected-error{{use of undeclared identifier 'member'}}
23+
wint_t wi0; // expected-error{{unknown type name 'wint_t'}}
24+
25+
#define __need_ptrdiff_t
26+
#include <stddef.h>
27+
28+
ptrdiff_t p1;
29+
size_t s1; // expected-error{{unknown type}}
30+
rsize_t r1; // expected-error{{unknown type}}
31+
wchar_t wc1;
32+
void *v1 = NULL; // expected-error{{undeclared identifier}}
33+
nullptr_t n1; // expected-error{{unknown type}}
34+
static void f1(void) { unreachable(); } // expected-error{{undeclared identifier}}
35+
max_align_t m1; // expected-error{{unknown type}}
36+
size_t o1 = offsetof(struct astruct, member); // expected-error{{unknown type}} expected-error{{expected expression}} expected-error{{undeclared identifier}}
37+
wint_t wi1; // expected-error{{unknown type}}
38+
39+
// The "must be declared before used" errors are only emitted the first time a
40+
// known-but-not-visible type is seen. At this point the _Builtin_stddef module
41+
// has been built and all of the types tried, so most of the errors won't be
42+
// repeated below in modules. The types still aren't available, just the errors
43+
// aren't repeated. e.g. rsize_t still isn't available, if r1 above got deleted,
44+
// its error would move to r2 below.
45+
46+
#define __need_size_t
47+
#include <stddef.h>
48+
49+
ptrdiff_t p2;
50+
size_t s2;
51+
rsize_t r2; // expected-error{{unknown type}}
52+
wchar_t wc2;
53+
void *v2 = NULL; // expected-error{{undeclared identifier}}
54+
nullptr_t n2; // expected-error{{unknown type}}
55+
static void f2(void) { unreachable(); } // expected-error{{undeclared identifier}}
56+
max_align_t m2; // expected-error{{unknown type}}
57+
size_t o2 = offsetof(struct astruct, member); // expected-error{{expected expression}} expected-error{{undeclared identifier}}
58+
wint_t wi2; // expected-error{{unknown type}}
59+
60+
#define __need_rsize_t
61+
#include <stddef.h>
62+
63+
ptrdiff_t p3;
64+
size_t s3;
65+
rsize_t r3;
66+
wchar_t wc3;
67+
void *v3 = NULL; // expected-error{{undeclared identifier}}
68+
nullptr_t n3; // expected-error{{unknown type}}
69+
static void f3(void) { unreachable(); } // expected-error{{undeclared identifier}}
70+
max_align_t m3; // expected-error{{unknown type}}
71+
size_t o3 = offsetof(struct astruct, member); // expected-error{{expected expression}} expected-error{{undeclared identifier}}
72+
wint_t wi3; // expected-error{{unknown type}}
73+
74+
#define __need_wchar_t
75+
#include <stddef.h>
76+
77+
ptrdiff_t p4;
78+
size_t s4;
79+
rsize_t r4;
80+
wchar_t wc4;
81+
void *v4 = NULL; // expected-error{{undeclared identifier}}
82+
nullptr_t n4; // expected-error{{unknown type}}
83+
static void f4(void) { unreachable(); } // expected-error{{undeclared identifier}}
84+
max_align_t m4; // expected-error{{unknown type}}
85+
size_t o4 = offsetof(struct astruct, member); // expected-error{{expected expression}} expected-error{{undeclared identifier}}
86+
wint_t wi4; // expected-error{{unknown type}}
87+
88+
#define __need_NULL
89+
#include <stddef.h>
90+
91+
ptrdiff_t p5;
92+
size_t s5;
93+
rsize_t r5;
94+
wchar_t wc5;
95+
void *v5 = NULL;
96+
nullptr_t n5; // expected-error{{unknown type}}
97+
static void f5(void) { unreachable(); } // expected-error{{undeclared identifier}}
98+
max_align_t m5; // expected-error{{unknown type}}
99+
size_t o5 = offsetof(struct astruct, member); // expected-error{{expected expression}} expected-error{{undeclared identifier}}
100+
wint_t wi5; // expected-error{{unknown type}}
101+
102+
// nullptr_t doesn't get declared before C23 because its definition
103+
// depends on nullptr.
104+
#define __need_nullptr_t
105+
#include <stddef.h>
106+
107+
ptrdiff_t p6;
108+
size_t s6;
109+
rsize_t r6;
110+
wchar_t wc6;
111+
void *v6 = NULL;
112+
nullptr_t n6;
113+
static void f6(void) { unreachable(); } // expected-error{{undeclared identifier}}
114+
max_align_t m6; // expected-error{{unknown type}}
115+
size_t o6 = offsetof(struct astruct, member); // expected-error{{expected expression}} expected-error{{undeclared identifier}}
116+
wint_t wi6; // expected-error{{unknown type}}
117+
118+
#define __need_unreachable
119+
#include <stddef.h>
120+
121+
ptrdiff_t p7;
122+
size_t s7;
123+
rsize_t r7;
124+
wchar_t wc7;
125+
void *v7 = NULL;
126+
nullptr_t n7;
127+
static void f7(void) { unreachable(); }
128+
max_align_t m7; // expected-error{{unknown type}}
129+
size_t o7 = offsetof(struct astruct, member); // expected-error{{expected expression}} expected-error{{undeclared identifier}}
130+
wint_t wi7; // expected-error{{unknown type}}
131+
132+
#define __need_max_align_t
133+
#include <stddef.h>
134+
135+
ptrdiff_t p8;
136+
size_t s8;
137+
rsize_t r8;
138+
wchar_t wc8;
139+
void *v8 = NULL;
140+
nullptr_t n8;
141+
static void f8(void) { unreachable(); }
142+
max_align_t m8;
143+
size_t o8 = offsetof(struct astruct, member); // expected-error{{expected expression}} expected-error{{undeclared identifier}}
144+
wint_t wi8; // expected-error{{unknown type}}
145+
146+
#define __need_offsetof
147+
#include <stddef.h>
148+
149+
ptrdiff_t p9;
150+
size_t s9;
151+
rsize_t r9;
152+
nullptr_t n9;
153+
static void f9(void) { unreachable(); }
154+
wchar_t wc9;
155+
void *v9 = NULL;
156+
max_align_t m9;
157+
size_t o9 = offsetof(struct astruct, member);
158+
wint_t wi9; // expected-error{{unknown type}}
159+
160+
#define __need_wint_t
161+
#include <stddef.h>
162+
163+
ptrdiff_t p10;
164+
size_t s10;
165+
rsize_t r10;
166+
wchar_t wc10;
167+
void *v10 = NULL;
168+
nullptr_t n10;
169+
static void f10(void) { unreachable(); }
170+
max_align_t m10;
171+
size_t o10 = offsetof(struct astruct, member);
172+
wint_t wi10;

0 commit comments

Comments
 (0)