1*ae360dc3SNico Weber // RUN: %clang_cc1 -fsyntax-only -triple x86_64-apple-macosx10.9.0 -verify -Wsentinel -std=c++11 %s
2272bcf67SNico Weber 
3272bcf67SNico Weber ptrdiff_t p0; // expected-error{{unknown}}
4272bcf67SNico Weber size_t s0; // expected-error{{unknown}}
5272bcf67SNico Weber void* v0 = NULL; // expected-error{{undeclared}}
6272bcf67SNico Weber wint_t w0; // expected-error{{unknown}}
7272bcf67SNico Weber max_align_t m0; // expected-error{{unknown}}
8272bcf67SNico Weber 
9272bcf67SNico Weber #define __need_ptrdiff_t
10272bcf67SNico Weber #include <stddef.h>
11272bcf67SNico Weber 
12272bcf67SNico Weber ptrdiff_t p1;
13272bcf67SNico Weber size_t s1; // expected-error{{unknown}}
14272bcf67SNico Weber void* v1 = NULL; // expected-error{{undeclared}}
15272bcf67SNico Weber wint_t w1; // expected-error{{unknown}}
16272bcf67SNico Weber max_align_t m1; // expected-error{{unknown}}
17272bcf67SNico Weber 
18272bcf67SNico Weber #define __need_size_t
19272bcf67SNico Weber #include <stddef.h>
20272bcf67SNico Weber 
21272bcf67SNico Weber ptrdiff_t p2;
22272bcf67SNico Weber size_t s2;
23272bcf67SNico Weber void* v2 = NULL; // expected-error{{undeclared}}
24272bcf67SNico Weber wint_t w2; // expected-error{{unknown}}
25272bcf67SNico Weber max_align_t m2; // expected-error{{unknown}}
26272bcf67SNico Weber 
27272bcf67SNico Weber #define __need_NULL
28272bcf67SNico Weber #include <stddef.h>
29272bcf67SNico Weber 
30272bcf67SNico Weber ptrdiff_t p3;
31272bcf67SNico Weber size_t s3;
32272bcf67SNico Weber void* v3 = NULL;
33272bcf67SNico Weber wint_t w3; // expected-error{{unknown}}
34272bcf67SNico Weber max_align_t m3; // expected-error{{unknown}}
35272bcf67SNico Weber 
36272bcf67SNico Weber // Shouldn't bring in wint_t by default:
37272bcf67SNico Weber #include <stddef.h>
38272bcf67SNico Weber 
39272bcf67SNico Weber ptrdiff_t p4;
40272bcf67SNico Weber size_t s4;
41272bcf67SNico Weber void* v4 = NULL;
42272bcf67SNico Weber wint_t w4; // expected-error{{unknown}}
43272bcf67SNico Weber max_align_t m4;
44272bcf67SNico Weber 
45272bcf67SNico Weber #define __need_wint_t
46272bcf67SNico Weber #include <stddef.h>
47272bcf67SNico Weber 
48272bcf67SNico Weber ptrdiff_t p5;
49272bcf67SNico Weber size_t s5;
50272bcf67SNico Weber void* v5 = NULL;
51272bcf67SNico Weber wint_t w5;
52272bcf67SNico Weber max_align_t m5;
53272bcf67SNico Weber 
54272bcf67SNico Weber 
55272bcf67SNico Weber // linux/stddef.h does something like this for cpp files:
56272bcf67SNico Weber #undef NULL
57272bcf67SNico Weber #define NULL 0
58272bcf67SNico Weber 
59272bcf67SNico Weber // glibc (and other) headers then define __need_NULL and rely on stddef.h
60272bcf67SNico Weber // to redefine NULL to the correct value again.
61272bcf67SNico Weber #define __need_NULL
62272bcf67SNico Weber #include <stddef.h>
63272bcf67SNico Weber 
64272bcf67SNico Weber // gtk headers then use __attribute__((sentinel)), which doesn't work if NULL
65272bcf67SNico Weber // is 0.
66272bcf67SNico Weber void f(const char* c, ...) __attribute__((sentinel));
g()67272bcf67SNico Weber void g() {
68272bcf67SNico Weber   f("", NULL);  // Shouldn't warn.
69272bcf67SNico Weber }
70