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

Nico Weber nicolasweber at gmx.de
Mon Apr 28 18:19:21 PDT 2014


Author: nico
Date: Mon Apr 28 20:19:21 2014
New Revision: 207482

URL: http://llvm.org/viewvc/llvm-project?rev=207482&view=rev
Log:
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.

Added:
    cfe/trunk/test/Headers/needsnull.cpp
Modified:
    cfe/trunk/lib/Headers/stddef.h

Modified: cfe/trunk/lib/Headers/stddef.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/stddef.h?rev=207482&r1=207481&r2=207482&view=diff
==============================================================================
--- cfe/trunk/lib/Headers/stddef.h (original)
+++ cfe/trunk/lib/Headers/stddef.h Mon Apr 28 20:19:21 2014
@@ -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)

Added: cfe/trunk/test/Headers/needsnull.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/needsnull.cpp?rev=207482&view=auto
==============================================================================
--- cfe/trunk/test/Headers/needsnull.cpp (added)
+++ cfe/trunk/test/Headers/needsnull.cpp Mon Apr 28 20:19:21 2014
@@ -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.
+}





More information about the cfe-commits mailing list