xref: /aosp_15_r20/external/clang/test/Headers/stddefneeds.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.9.0 -verify -Wsentinel -std=c++11 %s
2*67e74705SXin Li 
3*67e74705SXin Li ptrdiff_t p0; // expected-error{{unknown}}
4*67e74705SXin Li size_t s0; // expected-error{{unknown}}
5*67e74705SXin Li void* v0 = NULL; // expected-error{{undeclared}}
6*67e74705SXin Li wint_t w0; // expected-error{{unknown}}
7*67e74705SXin Li max_align_t m0; // expected-error{{unknown}}
8*67e74705SXin Li 
9*67e74705SXin Li #define __need_ptrdiff_t
10*67e74705SXin Li #include <stddef.h>
11*67e74705SXin Li 
12*67e74705SXin Li ptrdiff_t p1;
13*67e74705SXin Li size_t s1; // expected-error{{unknown}}
14*67e74705SXin Li void* v1 = NULL; // expected-error{{undeclared}}
15*67e74705SXin Li wint_t w1; // expected-error{{unknown}}
16*67e74705SXin Li max_align_t m1; // expected-error{{unknown}}
17*67e74705SXin Li 
18*67e74705SXin Li #define __need_size_t
19*67e74705SXin Li #include <stddef.h>
20*67e74705SXin Li 
21*67e74705SXin Li ptrdiff_t p2;
22*67e74705SXin Li size_t s2;
23*67e74705SXin Li void* v2 = NULL; // expected-error{{undeclared}}
24*67e74705SXin Li wint_t w2; // expected-error{{unknown}}
25*67e74705SXin Li max_align_t m2; // expected-error{{unknown}}
26*67e74705SXin Li 
27*67e74705SXin Li #define __need_NULL
28*67e74705SXin Li #include <stddef.h>
29*67e74705SXin Li 
30*67e74705SXin Li ptrdiff_t p3;
31*67e74705SXin Li size_t s3;
32*67e74705SXin Li void* v3 = NULL;
33*67e74705SXin Li wint_t w3; // expected-error{{unknown}}
34*67e74705SXin Li max_align_t m3; // expected-error{{unknown}}
35*67e74705SXin Li 
36*67e74705SXin Li // Shouldn't bring in wint_t by default:
37*67e74705SXin Li #include <stddef.h>
38*67e74705SXin Li 
39*67e74705SXin Li ptrdiff_t p4;
40*67e74705SXin Li size_t s4;
41*67e74705SXin Li void* v4 = NULL;
42*67e74705SXin Li wint_t w4; // expected-error{{unknown}}
43*67e74705SXin Li max_align_t m4;
44*67e74705SXin Li 
45*67e74705SXin Li #define __need_wint_t
46*67e74705SXin Li #include <stddef.h>
47*67e74705SXin Li 
48*67e74705SXin Li ptrdiff_t p5;
49*67e74705SXin Li size_t s5;
50*67e74705SXin Li void* v5 = NULL;
51*67e74705SXin Li wint_t w5;
52*67e74705SXin Li max_align_t m5;
53*67e74705SXin Li 
54*67e74705SXin Li 
55*67e74705SXin Li // linux/stddef.h does something like this for cpp files:
56*67e74705SXin Li #undef NULL
57*67e74705SXin Li #define NULL 0
58*67e74705SXin Li 
59*67e74705SXin Li // glibc (and other) headers then define __need_NULL and rely on stddef.h
60*67e74705SXin Li // to redefine NULL to the correct value again.
61*67e74705SXin Li #define __need_NULL
62*67e74705SXin Li #include <stddef.h>
63*67e74705SXin Li 
64*67e74705SXin Li // gtk headers then use __attribute__((sentinel)), which doesn't work if NULL
65*67e74705SXin Li // is 0.
66*67e74705SXin Li void f(const char* c, ...) __attribute__((sentinel));
g()67*67e74705SXin Li void g() {
68*67e74705SXin Li   f("", NULL);  // Shouldn't warn.
69*67e74705SXin Li }
70