Let stddef.h redefine NULL if __need_NULL is set, as needed by glibc, PR12997.

See the bug and the cfe-commits thread "[patch] Let stddef.h redefine NULL if
__need_NULL is set" for discussion.

Fixes PR12997 and is similar to the __need_wint_t bits already in this file.

llvm-svn: 207482
This commit is contained in:
Nico Weber 2014-04-29 01:19:21 +00:00
parent 326254f422
commit 8af28c1e61
2 changed files with 36 additions and 0 deletions

View File

@ -76,6 +76,7 @@ typedef __WCHAR_TYPE__ wchar_t;
#else
# define NULL ((void*)0)
#endif
#undef __need_NULL
#ifdef __cplusplus
#if defined(_MSC_EXTENSIONS) && defined(_NATIVE_NULLPTR_SUPPORTED)
@ -102,6 +103,21 @@ typedef double max_align_t;
#endif /* __STDDEF_H */
/* Some C libraries set __need_NULL and expects NULL to be defined again. */
#if defined(__need_NULL)
#undef NULL
#ifdef __cplusplus
# if !defined(__MINGW32__) && !defined(_MSC_VER)
# define NULL __null
# else
# define NULL 0
# endif
#else
# define NULL ((void*)0)
#endif
#undef __need_NULL
#endif
/* Some C libraries expect to see a wint_t here. Others (notably MinGW) will use
__WINT_TYPE__ directly; accommodate both by requiring __need_wint_t */
#if defined(__need_wint_t)

View File

@ -0,0 +1,20 @@
// RUN: %clang_cc1 -fsyntax-only -triple i386-linux-gnu -verify -Wsentinel %s
// expected-no-diagnostics
#include <stddef.h>
// linux/stddef.h does something like this for cpp files:
#undef NULL
#define NULL 0
// glibc (and other) headers then define __need_NULL and rely on stddef.h
// to redefine NULL to the correct value again.
#define __need_NULL
#include <stddef.h>
// gtk headers then use __attribute__((sentinel)), which doesn't work if NULL
// is 0.
void f(const char* c, ...) __attribute__((sentinel));
void g() {
f("", NULL); // Shouldn't warn.
}