Skip to content

Commit 3d2fb6a

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 3d2fb6a

File tree

3 files changed

+253
-3
lines changed

3 files changed

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

0 commit comments

Comments
 (0)