• S
    math: new type cast logic in tgmath.h · e9e2b66e
    Szabolcs Nagy 提交于
    * return type logic is simplified a bit and fixed (see below)
    * return type of conj and cproj were wrong on int arguments
    * added comments about the pending issues
    (usually we don't have comments in public headers but this is
    not the biggest issue with tgmath.h)
    
    casting the result to the right type cannot be done in c99
    (c11 _Generic can solve this but that is not widely supported),
    so the typeof extension of gcc is used and that the ?: operator
    has special semantics when one of the operands is a null
    pointer constant
    
    the standard is very strict about the definition of null
    pointer constants so typeof with ?: is still not enough so
    compiler specific workaround is used for now
    
    on gcc '!1.0' is a null pointer constant so we can use the old
    __IS_FP logic (eventhough it's non-standard)
    
    on clang (and on gcc as well) 'sizeof(void)-1' is a null
    pointer constant so we can use
     !(sizeof(*(0?(int*)0:(void*)__IS_FP(x)))-1)
    (this is non-standard as well), the old logic is used by
    default and this new one on clang
    e9e2b66e
tgmath.h 9.2 KB