Skip to content

Commit 9ccc7cd

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 54a9f0e commit 9ccc7cd

File tree

3 files changed

+258
-3
lines changed

3 files changed

+258
-3
lines changed

libcxx/include/stddef.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,28 @@
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+
# include <__config>
27+
typedef decltype(nullptr) nullptr_t;
28+
# undef __cxx_need_nullptr_t
29+
# endif
30+
31+
#elif !defined(_LIBCPP_STDDEF_H) || (defined(__STDC_WANT_LIB_EXT1__) && __STDC_WANT_LIB_EXT1__ >= 1)
2032
# define _LIBCPP_STDDEF_H
2133

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

0 commit comments

Comments
 (0)