Hi Eric,

Wow! What a large change.

> There are only 7 headers defined by POSIX to 
> define NULL, and we already provide gnulib overrides for 6 of the 7 (the only 
> one lacking was stddef.h itself).

You handled locale.h, stddef.h, stdio.h, stdlib.h, string.h, unistd.h, wchar.h,
but time.h also should define NULL, according to POSIX.

> Here's what I'm testing

I got some "malformed patch" errors while applying the patch. Due to wrapped
lines such as

  @@ -12,6 +12,11 @@ The macros @code{EXIT_SUCCESS} and @code{EXIT_FAILURE} are 
  not defined on

Can you produce your patches without the diff -p option, or attach them
rather than include them in the mail?

> This patch does not do anything about the *printf family basing a lot of code 
> on HAVE_WCHAR_T; one idea is that we could make the *printf-posix versions of 
> these macros require the stddef module and then blindly assume that wchar_t 
> is 
> available (although this means updating several #if checks), while leaving 
> the 
> simpler *printf versions at the mercy of the platform's (lack of) wchar_t.

The vasnprintf code is also shared with libintl, which does not use any
replacements of <locale.h>, <stdlib.h>, nor <stddef.h>. Therefore defining
wchar_t for all platforms, while possible, would not simplify vasnprintf.

> For that matter, I couldn't find any definitive documentation of a modern 
> platform 
> that lacks wchar_t (just that some uclibc builds lack <wchar.h>).

But the uClibc users are stubborn in their refusal to use wchar_t in some
builds.

> Any other comments, while I continue with my testing?

In unistd.in.h:32 I would change the comment
  /* NetBSD 5.0 mis-defines NULL.  */
to
  /* NetBSD 5.0 mis-defines NULL.  Also get size_t.  */

In m4/locale_h.m4 it's a waste of configure time to check for the include_next
support of locale.h if it's not going to be replaced. I would keep doing
  gl_CHECK_NEXT_HEADERS([locale.h])
conditionally.

Likewise for m4/stddef_h.m4 and m4/wchar.m4.

In m4/stddef_h.m4, I would not use a conditional expression inside an array
subscript. C requires an array subscript to be an integer constant
expression, but some older C standard did not mention that conditional
expressions consisting of integer constant expressions are integer constant
expressions. Therefore it's safer only to play with + - * /.

The replacement value that you are using for NULL is not right for C++. In
ISO C++ <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf>
sections 18.1.(3) and footnote 188 say
  "The macro NULL is an implementation-defined C++ null pointer constant in
   this International Standard (4.10).
   Possible definitions include 0 and 0L, but not (void*)0."
A test case is

============================= foo.cc ============================
#include <stddef.h>

struct A {
  int foo (void *);
  int foo (char *);
  int foo (int);
  int foo (long);
};

int A::foo (void *) { return 1; }
int A::foo (char *) { return 2; }
int A::foo (int) { return 0; }
int A::foo (long) { return 0; }

int verify_size[2 * (sizeof NULL == sizeof (void *)) - 1];

int main ()
{
  A x;
  return x.foo(NULL);
}
// g++ 3.1...4.3.3 all call A::foo (int).
// The openSUSE g++ 4.3.1 calls A::foo (long).
==================================================================


Find attached the changes that I would apply on top of yours (to be
applied with "patch -p0", as always).


--- doc/posix-headers/locale.texi.orig	2009-08-13 11:38:25.000000000 +0200
+++ doc/posix-headers/locale.texi	2009-08-13 10:52:43.000000000 +0200
@@ -12,7 +12,7 @@
 mingw.
 
 @item
-Some platforms provide @code{NULL} that cannot be used in arbitrary
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
 expressions:
 NetBSD 5.0
 @end itemize
--- doc/posix-headers/stddef.texi.orig	2009-08-13 11:38:25.000000000 +0200
+++ doc/posix-headers/stddef.texi	2009-08-13 10:52:42.000000000 +0200
@@ -11,7 +11,7 @@
 Some old platforms fail to provide @code{wchar_t}.
 
 @item
-Some platforms provide @code{NULL} that cannot be used in arbitrary
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
 expressions:
 NetBSD 5.0
 @end itemize
--- doc/posix-headers/stdio.texi.orig	2009-08-13 11:38:25.000000000 +0200
+++ doc/posix-headers/stdio.texi	2009-08-13 10:52:42.000000000 +0200
@@ -8,7 +8,7 @@
 Portability problems fixed by Gnulib:
 @itemize
 @item
-Some platforms provide @code{NULL} that cannot be used in arbitrary
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
 expressions:
 NetBSD 5.0
 @end itemize
--- doc/posix-headers/stdlib.texi.orig	2009-08-13 11:38:25.000000000 +0200
+++ doc/posix-headers/stdlib.texi	2009-08-13 10:52:43.000000000 +0200
@@ -14,7 +14,7 @@
 The macro @code{EXIT_FAILURE} is incorrectly defined on Tandem/NSK.
 
 @item
-Some platforms provide @code{NULL} that cannot be used in arbitrary
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
 expressions:
 NetBSD 5.0
 @end itemize
--- doc/posix-headers/string.texi.orig	2009-08-13 11:38:25.000000000 +0200
+++ doc/posix-headers/string.texi	2009-08-13 10:52:43.000000000 +0200
@@ -8,7 +8,7 @@
 Portability problems fixed by Gnulib:
 @itemize
 @item
-Some platforms provide @code{NULL} that cannot be used in arbitrary
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
 expressions:
 NetBSD 5.0
 @end itemize
--- doc/posix-headers/unistd.texi.orig	2009-08-13 11:38:25.000000000 +0200
+++ doc/posix-headers/unistd.texi	2009-08-13 10:52:43.000000000 +0200
@@ -20,7 +20,7 @@
 mingw.
 
 @item
-Some platforms provide @code{NULL} that cannot be used in arbitrary
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
 expressions:
 NetBSD 5.0
 @end itemize
--- doc/posix-headers/wchar.texi.orig	2009-08-13 11:38:25.000000000 +0200
+++ doc/posix-headers/wchar.texi	2009-08-13 10:52:43.000000000 +0200
@@ -18,7 +18,7 @@
 IRIX 5.3.
 
 @item
-Some platforms provide @code{NULL} that cannot be used in arbitrary
+Some platforms provide a @code{NULL} macro that cannot be used in arbitrary
 expressions:
 NetBSD 5.0
 @end itemize
--- lib/stddef.in.h.orig	2009-08-13 11:38:25.000000000 +0200
+++ lib/stddef.in.h	2009-08-13 11:36:41.000000000 +0200
@@ -60,7 +60,20 @@
 /* On NetBSD 5.0, the definition of NULL lacks proper parentheses.  */
 #if @REPLACE_NULL@
 # undef NULL
-# define NULL ((void *) 0)
+# ifdef __cplusplus
+   /* ISO C++ says that the macro NULL must expand to an integer constant
+      expression, hence '((void *) 0)' is not allowed in C++.  */
+#  if __GNUG__ >= 3
+    /* GNU C++ has a __null macro that behaves like an integer ('int' or
+       'long') but has the same size as a pointer.  Use that, to avoid
+       warnings.  */
+#   define NULL __null
+#  else
+#   define NULL 0L
+#  endif
+# else
+#  define NULL ((void *) 0)
+# endif
 #endif
 
 /* Some platforms lack wchar_t.  */
--- lib/unistd.in.h.orig	2009-08-13 11:38:25.000000000 +0200
+++ lib/unistd.in.h	2009-08-13 10:53:28.000000000 +0200
@@ -29,7 +29,7 @@
 #ifndef _GL_UNISTD_H
 #define _GL_UNISTD_H
 
-/* NetBSD 5.0 mis-defines NULL.  */
+/* NetBSD 5.0 mis-defines NULL.  Also get size_t.  */
 #include <stddef.h>
 
 /* mingw doesn't define the SEEK_* or *_FILENO macros in <unistd.h>.  */
--- m4/locale_h.m4.orig	2009-08-13 11:38:25.000000000 +0200
+++ m4/locale_h.m4	2009-08-13 10:55:25.000000000 +0200
@@ -12,17 +12,15 @@
 int x = LC_MESSAGES;], [],
        [gl_cv_header_working_locale_h=yes],
        [gl_cv_header_working_locale_h=no])])
-  if test $gl_cv_header_working_locale_h = yes; then
-    LOCALE_H=
-  else
-    LOCALE_H=locale.h
-  fi
-  AC_SUBST([LOCALE_H])
-  gl_CHECK_NEXT_HEADERS([locale.h])
 
   dnl If <stddef.h> is replaced, then <locale.h> must also be replaced.
   AC_REQUIRE([gl_STDDEF_H])
-  if test -n "$STDDEF_H"; then
+
+  if test $gl_cv_header_working_locale_h = yes && test -z "$STDDEF_H"; then
+    LOCALE_H=
+  else
+    gl_CHECK_NEXT_HEADERS([locale.h])
     LOCALE_H=locale.h
   fi
+  AC_SUBST([LOCALE_H])
 ])
--- m4/stddef_h.m4.orig	2009-08-13 11:38:25.000000000 +0200
+++ m4/stddef_h.m4	2009-08-13 11:01:22.000000000 +0200
@@ -9,7 +9,6 @@
 [
   AC_REQUIRE([gl_STDDEF_H_DEFAULTS])
   AC_REQUIRE([gt_TYPE_WCHAR_T])
-  gl_CHECK_NEXT_HEADERS([stddef.h])
   if test $gt_cv_c_wchar_t = no; then
     HAVE_WCHAR_T=0
     STDDEF_H=stddef.h
@@ -17,7 +16,7 @@
   AC_CACHE_CHECK([whether NULL can be used in arbitrary expressions],
     [gl_cv_decl_null_works],
     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stddef.h>
-      int test[sizeof NULL == sizeof (void *) ? 1 : -1];
+      int test[2 * (sizeof NULL == sizeof (void *)) -1];
 ]])],
       [gl_cv_decl_null_works=yes],
       [gl_cv_decl_null_works=no])])
@@ -25,6 +24,9 @@
     REPLACE_NULL=1
     STDDEF_H=stddef.h
   fi
+  if test -n "$STDDEF_H"; then
+    gl_CHECK_NEXT_HEADERS([stddef.h])
+  fi
 ])
 
 AC_DEFUN([gl_STDDEF_MODULE_INDICATOR],
--- m4/wchar.m4.orig	2009-08-13 11:38:25.000000000 +0200
+++ m4/wchar.m4	2009-08-13 11:06:19.000000000 +0200
@@ -27,7 +27,10 @@
   fi
   AC_SUBST([HAVE_WINT_T])
 
-  if test $gl_cv_header_wchar_h_standalone != yes || test $gt_cv_c_wint_t != yes; then
+  dnl If <stddef.h> is replaced, then <wchar.h> must also be replaced.
+  AC_REQUIRE([gl_STDDEF_H])
+
+  if test $gl_cv_header_wchar_h_standalone != yes || test $gt_cv_c_wint_t != yes || test -n "$STDDEF_H"; then
     WCHAR_H=wchar.h
   fi
 
@@ -42,12 +45,8 @@
     HAVE_WCHAR_H=0
   fi
   AC_SUBST([HAVE_WCHAR_H])
-  gl_CHECK_NEXT_HEADERS([wchar.h])
-
-  dnl If <stddef.h> is replaced, then <wchar.h> must also be replaced.
-  AC_REQUIRE([gl_STDDEF_H])
-  if test -n "$STDDEF_H"; then
-    WCHAR_H=wchar.h
+  if test -n "$WCHAR_H"; then
+    gl_CHECK_NEXT_HEADERS([wchar.h])
   fi
 ])
 

Reply via email to