Thread

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

    Darren King <darrenk@insightdist.com> — 1998-01-05T14:13:30Z

    > > 
    > > 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