Skip to content

Commit e4faef1

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 e4faef1

File tree

3 files changed

+254
-3
lines changed

3 files changed

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

0 commit comments

Comments
 (0)