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 Webervoid g() { 68272bcf67SNico Weber f("", NULL); // Shouldn't warn. 69272bcf67SNico Weber } 70