xref: /llvm-project/clang/test/Headers/stddefneeds.c (revision 9a7a6dd3c358ca7becef75c0a9581dcfa3e6b5f4)
1 // RUN: rm -fR %t
2 // RUN: %clang_cc1 -fsyntax-only -verify=c99 -std=c99 %s
3 // RUN: %clang_cc1 -fsyntax-only -verify=c23 -std=c23 %s
4 // RUN: %clang_cc1 -fsyntax-only -verify=c99-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -std=c99 %s
5 // RUN: %clang_cc1 -fsyntax-only -verify=c23-modules -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -std=c23 %s
6 
7 // Use C99 to verify that __need_ can be used to get types that wouldn't normally be available.
8 
9 struct astruct { char member; };
10 
11 ptrdiff_t p0; // c99-error{{unknown type name 'ptrdiff_t'}} c23-error{{unknown type}} \
12                  c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
13 size_t s0; // c99-error{{unknown type name 'size_t'}} c23-error{{unknown type}} \
14               c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
15 rsize_t r0; // c99-error{{unknown type name 'rsize_t'}} c23-error{{unknown type}} \
16                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
17 wchar_t wc0; // c99-error{{unknown type name 'wchar_t'}} c23-error{{unknown type}} \
18                 c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
19 void *v0 = NULL; // c99-error{{use of undeclared identifier 'NULL'}} c23-error{{undeclared identifier}} \
20                     c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}
21 nullptr_t n0; // c99-error{{unknown type name 'nullptr_t'}} c23-error{{unknown type}} \
22                  c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
f0(void)23 static void f0(void) { unreachable(); } // c99-error{{call to undeclared function 'unreachable'}} c23-error{{undeclared identifier 'unreachable'}} \
24                                            c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}
25 max_align_t m0; // c99-error{{unknown type name 'max_align_t'}} c23-error{{unknown type}} \
26                    c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
27 size_t o0 = offsetof(struct astruct, member); // c99-error{{unknown type name 'size_t'}} c99-error{{call to undeclared function 'offsetof'}} c99-error{{expected expression}} c99-error{{use of undeclared identifier 'member'}} \
28                                                  c23-error{{unknown type name 'size_t'}} c23-error{{undeclared identifier 'offsetof'}} c23-error{{expected expression}} c23-error{{use of undeclared identifier 'member'}} \
29                                                  c99-modules-error{{unknown type}} c99-modules-error{{undeclared function}} c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \
30                                                  c23-modules-error{{unknown type}} c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}
31 wint_t wi0; // c99-error{{unknown type name 'wint_t'}} c23-error{{unknown type}} \
32                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
33 
34 #define __need_ptrdiff_t
35 #include <stddef.h>
36 
37 ptrdiff_t p1;
38 size_t s1; // c99-error{{unknown type}} c23-error{{unknown type}} \
39               c99-modules-error{{'size_t' must be declared before it is used}} c23-modules-error{{must be declared}} \
40               c99-modules-note@__stddef_size_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_size_t.h:*{{declaration here is not visible}}
41 rsize_t r1; // c99-error{{unknown type}} c23-error{{unknown type}} \
42                c99-modules-error{{'rsize_t' must be declared before it is used}} c23-modules-error{{must be declared}} \
43                c99-modules-note@__stddef_rsize_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_rsize_t.h:*{{declaration here is not visible}}
44 wchar_t wc1; // c99-error{{unknown type}} c23-error{{unknown type}} \
45                 c99-modules-error{{'wchar_t' must be declared before it is used}} c23-modules-error{{must be declared}} \
46                 c99-modules-note@__stddef_wchar_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_wchar_t.h:*{{declaration here is not visible}}
47 void *v1 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \
48                     c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}
49 nullptr_t n1; // c99-error{{unknown type}} c23-error{{unknown type}} \
50                  c99-modules-error{{unknown type}} c23-modules-error{{'nullptr_t' must be declared before it is used}} \
51                  c23-modules-note@__stddef_nullptr_t.h:*{{declaration here is not visible}}
f1(void)52 static void f1(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \
53                                            c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}
54 max_align_t m1; // c99-error{{unknown type}} c23-error{{unknown type}} \
55                    c99-modules-error{{'max_align_t' must be declared before it is used}} c23-modules-error{{must be declared}} \
56                    c99-modules-note@__stddef_max_align_t.h:*{{declaration here is not visible}} c23-modules-note@__stddef_max_align_t.h:*{{declaration here is not visible}}
57 size_t o1 = offsetof(struct astruct, member); // c99-error{{unknown type}} c99-error{{expected expression}} c99-error{{undeclared identifier}} \
58                                                  c23-error{{unknown type}} c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \
59                                                  c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \
60                                                  c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}
61 wint_t wi1; // c99-error{{unknown type}} c23-error{{unknown type}} \
62                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
63 
64 // The "must be declared before used" errors are only emitted the first time a
65 // known-but-not-visible type is seen. At this point the _Builtin_stddef module
66 // has been built and all of the types tried, so most of the errors won't be
67 // repeated below in modules. The types still aren't available, just the errors
68 // aren't repeated. e.g. rsize_t still isn't available, if r1 above got deleted,
69 // its error would move to r2 below.
70 
71 #define __need_size_t
72 #include <stddef.h>
73 
74 ptrdiff_t p2;
75 size_t s2;
76 rsize_t r2; // c99-error{{unknown type}} c23-error{{unknown type}}
77             // c99-note@__stddef_size_t.h:*{{'size_t' declared here}} c23-note@__stddef_size_t.h:*{{'size_t' declared here}}
78 wchar_t wc2; // c99-error{{unknown type}} c23-error{{unknown type}}
79 void *v2 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \
80                     c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}
81 nullptr_t n2; // c99-error{{unknown type}} c23-error{{unknown type}} \
82                  c99-modules-error{{unknown type}}
f2(void)83 static void f2(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \
84                                            c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}
85 max_align_t m2; // c99-error{{unknown type}} c23-error{{unknown type}}
86 size_t o2 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \
87                                                  c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \
88                                                  c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \
89                                                  c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}
90 wint_t wi2; // c99-error{{unknown type}} c23-error{{unknown type}} \
91                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
92 
93 #define __need_rsize_t
94 #include <stddef.h>
95 
96 ptrdiff_t p3;
97 size_t s3;
98 rsize_t r3;
99 wchar_t wc3; // c99-error{{unknown type}} c23-error{{unknown type}}
100 void *v3 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \
101                     c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}
102 nullptr_t n3; // c99-error{{unknown type}} c23-error{{unknown type}} \
103                  c99-modules-error{{unknown type}}
f3(void)104 static void f3(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \
105                                            c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}
106 max_align_t m3; // c99-error{{unknown type}} c23-error{{unknown type}}
107 size_t o3 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \
108                                                  c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \
109                                                  c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \
110                                                  c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}
111 wint_t wi3; // c99-error{{unknown type}} c23-error{{unknown type}} \
112                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
113 
114 #define __need_wchar_t
115 #include <stddef.h>
116 
117 ptrdiff_t p4;
118 size_t s4;
119 rsize_t r4;
120 wchar_t wc4;
121 void *v4 = NULL; // c99-error{{undeclared identifier}} c23-error{{undeclared identifier}} \
122                     c99-modules-error{{undeclared identifier}} c23-modules-error{{undeclared identifier}}
123 nullptr_t n4; // c99-error{{unknown type}} c23-error{{unknown type}} \
124                  c99-modules-error{{unknown type}}
f4(void)125 static void f4(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \
126                                            c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}
127 max_align_t m4; // c99-error{{unknown type}} c23-error{{unknown type}}
128 size_t o4 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \
129                                                  c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \
130                                                  c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \
131                                                  c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}
132 wint_t wi4; // c99-error{{unknown type}} c23-error{{unknown type}} \
133                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
134 
135 #define __need_NULL
136 #include <stddef.h>
137 
138 ptrdiff_t p5;
139 size_t s5;
140 rsize_t r5;
141 wchar_t wc5;
142 void *v5 = NULL;
143 nullptr_t n5; // c99-error{{unknown type}} c23-error{{unknown type}} \
144                  c99-modules-error{{unknown type}}
f5(void)145 static void f5(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \
146                                            c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}
147 max_align_t m5; // c99-error{{unknown type}} c23-error{{unknown type}}
148 size_t o5 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \
149                                                  c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \
150                                                  c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \
151                                                  c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}
152 wint_t wi5; // c99-error{{unknown type}} c23-error{{unknown type}} \
153                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
154 
155 // nullptr_t doesn't get declared before C23 because its definition
156 // depends on nullptr.
157 #define __need_nullptr_t
158 #include <stddef.h>
159 
160 ptrdiff_t p6;
161 size_t s6;
162 rsize_t r6;
163 wchar_t wc6;
164 void *v6 = NULL;
165 nullptr_t n6; // c99-error{{unknown type}} c99-modules-error{{unknown type}}
f6(void)166 static void f6(void) { unreachable(); } // c99-error{{undeclared function}} c23-error{{undeclared identifier}} \
167                                            c99-modules-error{{undeclared function}} c23-modules-error{{undeclared identifier}}
168 max_align_t m6; // c99-error{{unknown type}} c23-error{{unknown type}}
169 size_t o6 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \
170                                                  c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \
171                                                  c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \
172                                                  c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}
173 wint_t wi6; // c99-error{{unknown type}} c23-error{{unknown type}} \
174                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
175 
176 #define __need_unreachable
177 #include <stddef.h>
178 
179 ptrdiff_t p7;
180 size_t s7;
181 rsize_t r7;
182 wchar_t wc7;
183 void *v7 = NULL;
184 nullptr_t n7 ; // c99-error{{unknown type}} c99-modules-error{{unknown type}}
f7(void)185 static void f7(void) { unreachable(); }
186 max_align_t m7; // c99-error{{unknown type}} c23-error{{unknown type}}
187 size_t o7 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \
188                                                  c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \
189                                                  c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \
190                                                  c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}
191 wint_t wi7; // c99-error{{unknown type}} c23-error{{unknown type}} \
192                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
193 
194 #define __need_max_align_t
195 #include <stddef.h>
196 
197 ptrdiff_t p8;
198 size_t s8;
199 rsize_t r8;
200 wchar_t wc8;
201 void *v8 = NULL;
202 nullptr_t n8; // c99-error{{unknown type}} c99-modules-error{{unknown type}}
f8(void)203 static void f8(void) { unreachable(); }
204 max_align_t m8;
205 size_t o8 = offsetof(struct astruct, member); // c99-error{{expected expression}} c99-error{{undeclared identifier}} \
206                                                  c23-error{{undeclared identifier}} c23-error{{expected expression}} c23-error{{undeclared identifier}} \
207                                                  c99-modules-error{{expected expression}} c99-modules-error{{undeclared identifier}} \
208                                                  c23-modules-error{{undeclared identifier}} c23-modules-error{{expected expression}} c23-modules-error{{undeclared identifier}}
209 wint_t wi8; // c99-error{{unknown type}} c23-error{{unknown type}} \
210                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
211 
212 #define __need_offsetof
213 #include <stddef.h>
214 
215 ptrdiff_t p9;
216 size_t s9;
217 rsize_t r9;
218 nullptr_t n9; // c99-error{{unknown type}} c99-modules-error{{unknown type}}
f9(void)219 static void f9(void) { unreachable(); }
220 wchar_t wc9;
221 void *v9 = NULL;
222 max_align_t m9;
223 size_t o9 = offsetof(struct astruct, member);
224 wint_t wi9; // c99-error{{unknown type}} c23-error{{unknown type}} \
225                c99-modules-error{{unknown type}} c23-modules-error{{unknown type}}
226 
227 #define __need_wint_t
228 #include <stddef.h>
229 
230 ptrdiff_t p10;
231 size_t s10;
232 rsize_t r10;
233 wchar_t wc10;
234 void *v10 = NULL;
235 nullptr_t n10; // c99-error{{unknown type}} c99-modules-error{{unknown type}}
f10(void)236 static void f10(void) { unreachable(); }
237 max_align_t m10;
238 size_t o10 = offsetof(struct astruct, member);
239 wint_t wi10;
240