Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 16 Apr 2010 19:32:55 +1000 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        David Schultz <das@FreeBSD.org>
Cc:        Juli Mallett <jmallett@FreeBSD.org>, svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org
Subject:   Re: svn commit: r205954 - head/include
Message-ID:  <20100416185222.X1124@delplex.bde.org>
In-Reply-To: <20100415212734.GA17239@zim.MIT.EDU>
References:  <201003310212.o2V2CO7b063419@svn.freebsd.org> <20100415212734.GA17239@zim.MIT.EDU>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 15 Apr 2010, David Schultz wrote:

> On Wed, Mar 31, 2010, Juli Mallett wrote:
>>   Be like stdlib.h and bring in a wchar_t definition and use it to prototype
>>   wcstoimax and wcstoumax, rather than spelling it __wchar_t.  This is necessary
>>   to use these functions in C++ where wchar_t is different to __wchar_t and is
>>   a built-in type.
>
> I don't think this change is correct for C mode.  POSIX says
> wchar_t is *supposed* to be defined by stdlib.h and wchar.h, but
                                         ^stddef.h, 
> its definition is namespace pollution elsewhere.

C99 says the same, at least in old drafts.  C99 also says that for the
functions in <inttypes.h> that use wchar_t, both <inttypes.h> and
<stddef.h> must be included (by giving both of these headers in the
synopses for these functions, and no explicit alternatives anywhere).
However, this is unusable and close to unimplementable, especially the
latter:
- including <inttypes.h> without including <stddef.h> should work when
   these functions are not used.  FreeBSD used to use the usual implementation
   involving underscored named to make this case works without polluting
   <inttypes.h> with wchar_t.  It is hard to make this case work while
   detecting the error in the case where these functions are used but
   <stddef.h> is not included.
- it is even harder and even sillier to detect the error in the case where
   these functions are used and some other header that declares wchar_t is
   included, but <stddef.h> is not included :-).  Perhaps fine print in
   C99 overrides the silly literal requirement, but I couldn't find it.

POSIX (at least in old 2001 draft 7) is only slightly different here.
It only mentions <inttypes.h> in the synopses, but gives <wchar.h> in
examples.  But current POSIX (at least in the most recent html man page
for wcstoimax found by google) has caught down to C99: it now specifies
<stddef.h> and <inttypes.h> in the synopsis, and doesn't say anything
about alternatives to <stddef.h> in the synopses, and doesn't say anything
special about wchar_t.

I couldn't find anything useful about this problem using google.  I found
mainly confusion about it in FOSS mailing lists, with no signs of standards
being aware of it.

IMO, the functions using wchar_t should never have been put in
<inttypes.h>.  The corresponding problem for <stdio.h> was carefully
avoided by putting all the stdio functions that use wchar_t in <wchar.h>
(where it causes corresponding problems for stdio types like FILE (*)).
However, these functions have been misplaced for so long that the
shouldn't be moved, and the easiest fix is to standardize the pollution.

(*) The problems for FILE in <wchar.h> are handled equally badly by
standards and equally well by FreeBSD (compared with old-FreeBSD for
wchar_t in <inttypes.h>).  FILE would be namespace pollution in
<wchar.h>, and FreeBSD is careful not to add it, and standards require
inclusion of both <stdio.h> and <wchar.h> before using functions that
use both FILE and wchar_t, but the latter is unusuable and close to
unimplementable, as above.  Now the functions are reasonably well
placed (you wouldn't want a <stdio-with-wchar.h> header just to hold
them), and again the easiest fix is to standardize the pollution.
At least the pollution wouldn't go all the way to <stdio.h>.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100416185222.X1124>