Re: [PORTS] (void)NULL in macros and aix

Started by Nonameabout 28 years ago1 messages
#1Noname
darrenk@insightdist.com

2. This is more like a C issue rather than aix-specific. The aix compiler complains
about assigning the (void)NULL to isnull in the heap_getattr macro. Changing the
(void) to (bool) works and seems like it should be (bool) to match the type of isnull,
shouldn't it?

*** include/access/heapam.h.org	Sun Jan  4 23:52:05 1998
--- include/access/heapam.h	Sun Jan  4 23:52:11 1998
***************
*** 101,110 ****
#define heap_getattr(tup, b, attnum, tupleDesc, isnull) \
(AssertMacro((tup) != NULL) ? \
((attnum) > (int) (tup)->t_natts) ? \
! 			(((isnull) ? (*(isnull) = true) : (void)NULL), (Datum)NULL) : \
((attnum) > 0) ? \
fastgetattr((tup), (attnum), (tupleDesc), (isnull)) : \
! 		(((isnull) ? (*(isnull) = false) : (void)NULL), heap_getsysattr((tup), (b), (attnum))) : \
(Datum)NULL)
extern HeapAccessStatistics heap_access_stats;	/* in stats.c */
--- 101,110 ----
#define heap_getattr(tup, b, attnum, tupleDesc, isnull) \
(AssertMacro((tup) != NULL) ? \
((attnum) > (int) (tup)->t_natts) ? \
! 			(((isnull) ? (*(isnull) = true) : (bool)NULL), (Datum)NULL) : \
((attnum) > 0) ? \
fastgetattr((tup), (attnum), (tupleDesc), (isnull)) : \
! 		(((isnull) ? (*(isnull) = false) : (bool)NULL), heap_getsysattr((tup), (b), (attnum))) : \
(Datum)NULL)

extern HeapAccessStatistics heap_access_stats; /* in stats.c */

We made if void so that we would stop getting gcc warnings about 'unused
left-hand side of conditional' messages. Does aix complain or stop. If
it just complains, I think we have to leave it alone, because everyone
else will complain about bool.

But this is then trying to assign a (void)NULL to isnull, which is a bool (really a char).
IMHO gcc should complain. Aix gives a severe error since the types don't match.

Maybe better to have a warning than fix it by causing an error. Gcc just happens to be in
a forgiving mood. What does the C standard say about casting (void) ptrs to other types?

Why not make this a _little_ more legible and compiler-friendly by making it into an
if-then-else block? Is the ?: operator really saving any ops?

---------

Re: the StrNCpy macro...

The aix compiler complains about trying to assign a (void)NULL to (len > 0). Can this be
fixed with another set of parens separating the returned dest from the ?: operator?

Like...

(((strncpy((dst),(src),(len)),(len > 0)) ? *((dst)+(len)-1)='\0' : ((char)NULL)),(dst)))
^ ^

This gets the return value back doesn't it? And changing to a (char)NULL makes the
compiler happy again too. Is this acceptable?

darrenk