Re: [commit: ghc] master: define own version of PRIdPTR on platform where its not available (71f7ab6)

Karel Gardas <[email protected]>
Newsgroups gmane.comp.lang.haskell.cvs.ghc
Message-ID <[email protected]>
On 11/ 9/12 11:34 AM, Gabriel Dos Reis wrote:
>> commit 71f7ab6a05448e48a3b5741bb8a5ef57701e9c70
>> Author: Karel Gardas<[email protected]>
>> Date:   Thu Nov 8 22:04:44 2012 +0100
>>
>>      define own version of PRIdPTR on platform where its not available
>>
>>      Note that PRIdPTR is considered as linux-ism so it's not available on platforms
>>      like Solaris, although some other free Unix(-like) OSes apparently supports
>>      it too.
>
> The log comment is not correct.
> In fact, it is ISO C99 standard; some old proprietary C system headers
> not have it (13 years later) but it is not linux-ism.

Hello,

I've analyzed the issue and it looks like, Solaris is defining PRIdPTR 
in sys/int_fmtio.h, this file is thorough sys/inttypes.h included into 
inttypes.h when !defined(_XOPEN_SOURCE) || defined(_XPG6) || 
defined(__EXTENSIONS__) -- unfortunately GHC's PosixSource.h which is 
included before inttypes.h in mkDerivedconstants.c defines _XOPEN_SOURCE 
for Solaris which means PRdPTR is not defined as the sys/int_fmtio.h is 
not included under such conditions.

Now, I'm not expert in C nor in C99, but what does it mean? That Solaris 
is strict and does not consider _XOPEN_SOURCE to be C99?

Small test:

#define _XOPEN_SOURCE

#include <stdio.h>
#include <inttypes.h>

int
main()
{
printf("%s\n", PRIdPTR);
return 0;
}

reveals that it cannot be compiled with gcc -std=c99 test.c due to 
following error:
In file included from /usr/include/stdio.h:15:0,
                  from test.c:3:
/usr/include/sys/feature_tests.h:354:2: error: #error "Compiler or 
options invalid for pre-UNIX 03 X/Open applications 	and pre-2001 POSIX 
applications"
test.c: In function ‘main’:
test.c:9:16: error: ‘PRIdPTR’ undeclared (first use in this function)
test.c:9:16: note: each undeclared identifier is reported only once for 
each function it appears in

and of course it cannot be compiled with simple gcc test.c due to:

test.c: In function ‘main’:
test.c:9:16: error: ‘PRIdPTR’ undeclared (first use in this function)
test.c:9:16: note: each undeclared identifier is reported only once for 
each function it appears in


When I remove _XOPEN_SOURCE definition, then the compilation with or 
without -std=c99 goes fine. To me it looks like _XOPEN_SOURCE is kind of 
in conflict with C99 -- at least on Solaris. The question is if Solaris 
team is right here or wrong here and how other platforms use/support this...

But most important question is to undefine _XOPEN_SOURCE or define 
either _XPG6 or __EXTENSION__ just on Solaris? What's the most cleanest 
solution?

Thanks for any idea!
Karel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.