[cfe-dev] Proposed change to __builtin_overload

Howard Hinnant hhinnant at apple.com
Mon Feb 9 06:56:26 PST 2009


On Feb 9, 2009, at 3:55 AM, Chris Lattner wrote:

> I've been pondering on tgmath.h, but it is more evil than I thought.
> As such, I'd like to extend __builtin_overload like this:
> http://clang.llvm.org/docs/LanguageExtensions.html#__builtin_overload
>
> The basic problem is that tgmath doesn't follow standard arithmetic
> promotion rules.  For example fmax(int, float) is supposed to call the
> double version of fmax, not the float version as normal promotion
> rules would specify.
>
> Because I couldn't find a non-evil approach to handling this (e.g.
> with builtin_classify_type like GCC does) I just decided to allow a
> fixed set of programmable promotion rules.  This way, we can support
> any craziness in altivec.h, support the standard promotion rules, and
> support tgmath.h all in one framework.
>
> I noticed this in altivec.h, which I found pretty amusing/scary:
>
> /* Predicates.
>    For C++, we use templates in order to allow non-parenthesized
> arguments.
>    For C, instead, we use macros since non-parenthesized arguments  
> were
>    not allowed even in older GCC implementation of AltiVec.  */
>
> /* Be very liberal in the pairs we accept.  Mistakes such as passing
>    a `vector char' and `vector short' will be caught by the middle- 
> end,
>    while any attempt to detect them here would produce hard to
> understand
>    error messages involving the implementation details of AltiVec.  */
>
> I think the first argument to __builtin_overload will completely fix
> the ugly hack they are using here (rejecting bugs in codegen instead
> of in sema).
>
> If this isn't completely revolting to people, I'll implement it in the
> next few days.
>
> Oh yeah, we also now have a place to document our language extensions,
> woo.

Looks reasonable but I see a bug:

The choices "tgmath" and "tgmath1" are too limiting.  I suspect that  
you will ultimately need a way of specifying any combination of the  
arguments are "generic".  "tgmath" is interpreted as "all parameters  
are generic" and "tgmath1" as "the first parameter is generic."   
There's no telling what the C committee will throw at you next year.   
And indeed, they've already bitten you with remquo:

    double remquo(double x, double y, int *quo);

Both x and y are generic, but not quo.

The C++ <cmath> has to implement this same logic, but gets to use C++  
to do it. :-)  If it is helpful, see the cayuga <cmath> and  
<type_traits> for an example C++ implementation, at least for the non- 
complex parts.  I'm not suggesting that clang's <tgmath.h> be  
implemented in C++.  Only that seeing a C++ implementation may spark  
an idea for a more flexible __builtin_overload.

Or at the very least, you need "tgmath2". :-)

-Howard




More information about the cfe-dev mailing list