]> Savannah Git Hosting - gnulib.git/commitdiff
nullptr: work around Apple clang 14 issue
authorPaul Eggert <eggert@cs.ucla.edu>
Fri, 10 Feb 2023 01:09:23 +0000 (17:09 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Fri, 10 Feb 2023 01:10:04 +0000 (17:10 -0800)
Problem reported by Bruno Haible in:
https://lists.gnu.org/r/bug-gnulib/2023-02/msg00098.html
* doc/gnulib.texi (nullptr): Document limitations better.
* m4/nullptr.m4 (gl_NULLPTR): Check for incompatibility of macOS
clang 14.0.0 (clang-1400.0.29.202), where <stddef.h> defines a
non-working nullptr macro.

ChangeLog
doc/gnulib.texi
m4/nullptr.m4

index 867107bb14950662560e936c829be22cd576256a..ce5ce330e62176d28abf6f67b6210d14b49aefd2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2023-02-09  Paul Eggert  <eggert@cs.ucla.edu>
+
+       nullptr: work around Apple clang 14 issue
+       Problem reported by Bruno Haible in:
+       https://lists.gnu.org/r/bug-gnulib/2023-02/msg00098.html
+       * doc/gnulib.texi (nullptr): Document limitations better.
+       * m4/nullptr.m4 (gl_NULLPTR): Check for incompatibility of macOS
+       clang 14.0.0 (clang-1400.0.29.202), where <stddef.h> defines a
+       non-working nullptr macro.
+
 2023-02-09  Bruno Haible  <bruno@clisp.org>
 
        math: Fix compilation error in C++ mode on macOS 12.5.
index 6fe2678834348c0c74737b7d6694e0d9b922149c..28d8c20d8cf2f6fe413b5969233fffc729fdc749 100644 (file)
@@ -954,9 +954,10 @@ In C, it has type @code{void *}; in C++ it has an integer type.
 
 @item
 On older platforms Gnulib cannot easily emulate @code{nullptr_t}, so
-null pointer type checking is more error prone, and @code{_Generic}
-expressions cannot reliably distinguish @code{nullptr}'s type from
-integer or @code{void *} types.
+null pointer type checking is more error prone.  In C, @code{_Generic}
+expressions cannot reliably distinguish the type of @code{nullptr}
+from integer or @code{void *} types.  C++ overloading has similar
+limitations.
 @end itemize
 
 @node static_assert
index a0b438be941d621d23257c98804b475cb0fcf7b9..1f8ab51b8548f505b675d1dd226598ba1037436f 100644 (file)
@@ -28,20 +28,30 @@ AC_DEFUN([gl_NULLPTR],
        [AC_COMPILE_IFELSE(
           [AC_LANG_SOURCE([[int *p = nullptr;]])],
           [gl_cv_cxx_nullptr=yes],
-          [gl_cv_cxx_nullptr=no])])
-      gl_cxx_nullptr=$gl_cv_cxx_nullptr
-      AC_LANG_POP([C++])],
-     [gl_cxx_nullptr=no])
-  if test "$gl_cxx_nullptr" = yes; then
-    AC_DEFINE([HAVE_CXX_NULLPTR], [1], [Define to 1 if C++ nullptr works.])
-  fi
+          [AC_COMPILE_IFELSE(
+             [AC_LANG_SOURCE([[#include <stddef.h>
+                               int *p = nullptr;]])],
+             [gl_cv_cxx_nullptr="yes, but it is a <stddef.h> macro"],
+             [gl_cv_cxx_nullptr=no])])])
+     AS_CASE([$gl_cv_cxx_nullptr],
+       [yes],  [gl_have_cxx_nullptr=1],
+       [yes*], [gl_have_cxx_nullptr="(-1)"],
+               [gl_have_cxx_nullptr=0])
+     AC_DEFINE_UNQUOTED([HAVE_CXX_NULLPTR], [$gl_have_cxx_nullptr],
+                        [Define to 1 if C++ nullptr works, 0 if not,
+                         (-1) if it is a <stddef.h> macro.])
+     AC_LANG_POP([C++])])
 ])
 
-  AH_VERBATIM([nullptr],
-[#ifndef nullptr /* keep config.h idempotent */
+  AH_VERBATIM([zznullptr],
+[#if defined __cplusplus && HAVE_CXX_NULLPTR < 0
+# include <stddef.h>
+# undef/**/nullptr
+#endif
+#ifndef nullptr
 # if !defined __cplusplus && !defined HAVE_C_NULLPTR
 #  define nullptr ((void *) 0)
-# elif defined __cplusplus && !defined HAVE_CXX_NULLPTR
+# elif defined __cplusplus && HAVE_CXX_NULLPTR <= 0
 #  if 3 <= __GNUG__
 #   define nullptr __null
 #  else